Spark> 2 - пользовательский ключ разделения во время операции соединения - PullRequest
0 голосов
/ 29 ноября 2018

Мне интересно, можем ли мы заставить Spark использовать пользовательский ключ разделения во время операции соединения с двумя фреймами данных.

Например, давайте рассмотрим

df1: DataFrame - [groupid, other_column_a]
df2: DataFrame - [groupid, other_column_b]

Если я запускаю

df_join = df1.join(df2, "groupid")

Spark установит «groupid» в качестве ключа раздела и выполнит объединение для каждого раздела.Проблема в том, что это может привести к нехватке памяти на машине, если раздел слишком большой.

Тем не менее, теоретически возможно выполнить объединение, скажем, (groupid, other_column_a) в качестве ключа разделения (чтобы уменьшить размеркаждый раздел).

Возможно ли это сделать с помощью Spark?Я попытался сделать df1.repartition("group_id","other_column_a") авансом, но это переопределяется соединением (я проверяю это с помощью df_join.explain()).Я не могу найти в Интернете ни одного ресурса, объясняющего, как это сделать.

Спасибо!

Visual explanation

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Если вы присоединяетесь к некоторому целочисленному столбцу, который я хотел бы, вы можете разбить ваш фрейм данных с помощью модуля по некоторому числу ... то есть, сколько разделов вы хотите ... таким образом, идентификатор, который разделяет некоторое общее хеш-значение, будетсгруппированы в один раздел .. тогда вы можете выполнить ваше объединение, разбив несколько соединений .. соединяя каждый раздел последовательно в цикле .. Я подробно объяснил этот случай .. Эффективное соединение pyspark

0 голосов
/ 29 ноября 2018

Тем не менее, теоретически возможно выполнить объединение с помощью say (groupid, other_column_a)

Это не правильно.Чтобы выполнить объединение, Spark должен переместить все записи с groupid в один раздел, поэтому использование (groupid, other_column_a) возможно, если:

  • (groupid, other_column_a) где ключи объединения.
  • Между other_column_a и group_id были * функциональные отношения.

Первое условие явно не выполнено, поскольку вы присоединяетесь только к groupid, второе не решит проблемураспределение будет таким же или хужеПервые 199, как улучшить ).

...