Spark join - 匹配长列表中的任何列
Spark join - match any column from a long list
我需要加入两个table,条件是table中的一列匹配任何列形成一个很长的列表,即如下:
columns = ['name001', 'name002', ..., 'name298']
df = df1.join(df2, (df1['name']==df2['name1']) | (df1['name']==df2['name2']) | ... | df1['name']==df2['name298'])
如何在不编写长条件的情况下在 Pyspark 中实现此连接?非常感谢!
您可以在 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)
我需要加入两个table,条件是table中的一列匹配任何列形成一个很长的列表,即如下:
columns = ['name001', 'name002', ..., 'name298']
df = df1.join(df2, (df1['name']==df2['name1']) | (df1['name']==df2['name2']) | ... | df1['name']==df2['name298'])
如何在不编写长条件的情况下在 Pyspark 中实现此连接?非常感谢!
您可以在 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)