У меня есть два больших фрейма данных 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: оба кадра данных слишком велики для трансляции