Spark join - сопоставить любой столбец из длинного списка - PullRequest
0 голосов
/ 14 января 2019

Мне нужно объединить две таблицы, при условии, что один столбец таблицы соответствует любому столбцу из очень длинного списка, т. Е. Следующее:

columns = ['name001', 'name002', ..., 'name298']

df = df1.join(df2, (df1['name']==df2['name1']) | (df1['name']==df2['name2']) | ... | df1['name']==df2['name298'])

Как я могу реализовать это объединение в Pyspark без написания длинных условий? Большое спасибо!

1 Ответ

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

Вы можете использовать цикл над списком columns для построения выражения join:

join_expr = (df1["name"] == df2[columns[0]])
for c in columns[1:]:
    join_expr = join_expr | (df1["name"] == df2[c])

Или используя functools.reduce:

from functools import reduce

join_expr = reduce(
    lambda e, c: e | (df1["name"]==df2[c]),
    columns[1:], 
    df1["name"]==df2[columns[0]]
)

Теперь используйте join_expr, чтобы присоединиться:

df = df1.join(df2, on=join_expr)
...