Spark连接-匹配长列表中的任何列

时间:2019-01-14 17:07:10

标签: join pyspark pyspark-sql

我需要连接两个表,条件是一个表的一列与一个很长的列表中的任何列匹配,即以下内容:

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

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

如何在Pyspark中实现此联接,而无需写长条件?非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以在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)