Эффективное левостороннее объединение Spark для нескольких столбцов, когда кадры данных разделены на один столбец - PullRequest
0 голосов
/ 10 июня 2018

У меня есть два больших фрейма данных df1 и df2, разделенных по столбцу a, и я хочу эффективно вычислить левое соединение как для a, так и для другого столбца b:

df1.join(df2, on=['a', 'b'], how='left_outer')

При написании, как указано выше, Spark переставляет оба кадра данных по ключу (a, b), что крайне неэффективно.Вместо этого я хотел бы воспользоваться существующим разделением на a, чтобы избежать случайного перемешивания (выполнения объединения внутри каждого раздела), что должно быть намного быстрее (особенно с учетом того, что у меня есть дополнительные этапы обработки, которые выигрывают от этого разделения).

Можно ли как-нибудь предотвратить это перемешивание и получить результирующий кадр данных, разделенный на a?

Обратите внимание, что если бы это было внутреннее соединение, я мог бы выполнитьниже, но (1) я не уверен, будет ли это эффективно, и в любом случае (2) он не работает с левым соединением (я предоставляю его только в том случае, если это поможет кому-то еще):

df1.join(df2, on=['a'], how='inner').filter(df1.b == df2.b)

PS: оба кадра данных слишком велики для трансляции

...