Умножает ли объединенная таблица в Spark выбранные столбцы меньшей таблицы?

avatar
Vitaliy
8 апреля 2018 в 09:24
46
1
1

У меня есть две таблицы в spark:

T1
|--x1
|--x2

T2
|--z1
|--z2
  • T1 намного больше, чем T2
  • Значения в столбце z2 очень большие
  • Существует отношение Многие-Один между T1 и T2 соответственно (через столбцы x2 и z1).

Я выполняю следующий запрос:

select T1.x1, T2.z2 from T1
join T2 on T1.x2 = T2.z1

В результирующем наборе данных одно и то же значение из T2.z2 будет умножено на множество значений T1.x1.

Поскольку это значение очень тяжелое, меня беспокоит, действительно ли данные дублируются или существуют внутренние оптимизации, поддерживающие только ссылки?

Источник

Ответы (1)

avatar
Alper t. Turker
8 апреля 2018 в 11:29
0

Не существует ответа, охватывающего все возможные сценарии. Точное поведение будет зависеть от количества факторов:

  • Тип соединения — широковещательные соединения по определению будут дублировать ваши данные на разных узлах, а хэш-соединения — нет.
  • Объем доступной памяти — любые выбросы данных, которые сериализуют данные, могут дублировать требования к памяти для вывода.
  • Кэширование, распределение данных и типы данных — Spark использует для кэширования представление по столбцам, а не по строкам, а также использует различные методы сжатия и кодирования для столбцов в зависимости от типа данных и статистики времени выполнения.

Только первая пуля является частью общедоступного API, остальные являются внутренними и могут различаться от версии к версии.

В остальных случаях поведение Spark не отличается от стандартного кода Java/Scala — ссылки — это просто ссылки, и я не знаю никаких оптимизаций в этом пространстве.

Vitaliy
8 апреля 2018 в 11:49
0

Обратите внимание, что я не спрашиваю о том, как будет оцениваться выражение соединения. Учитывая, что мой набор результатов будет иметь повторяющиеся значения из-за искры соединения, фактически дублируются данные или только ссылки.

Alper t. Turker
8 апреля 2018 в 13:32
0

То, как это оценивается, имеет основополагающее значение для ответа

Vitaliy
8 апреля 2018 в 17:50
0

Справедливо. Предположим, что данные не сериализованы — они все еще дублируются? кроме того, даже если данные представлены в сериализованной форме, абсолютно возможно пометить определенные значения как ссылки на «одиночное» значение. Поскольку RDD и фреймы данных неизменяемы, кажется правильным реализовать такую ​​оптимизацию. В любом случае, я все равно собираюсь проверить синтетический эксперимент, но надеялся, что есть какая-то документация по этому поводу.