让我们假设我们有两个 Dataframe ,我们想用leftanti join比较它们的差异:
data1 = [
(1, 11, 20, None),
(2, 12, 22, 31),
]
data2 = [
(1, 11, 20, None),
(2, 12, 22, 31),
]
schema = StructType([ \
StructField("value_1",IntegerType(), True), \
StructField("value_2",IntegerType(), True), \
StructField("value_3",IntegerType(), True), \
StructField("value_4",IntegerType(), True), \
])
df1 = spark.createDataFrame(data=data1,schema=schema)
df2 = spark.createDataFrame(data=data2,schema=schema)
如何通过多个(所有)列来nullsafe连接这些 Dataframe ?我想到的唯一解决方案如下:
df = df1.join(df2, \
((df1.value_1.eqNullSafe(df2.value_1)) &
(df1.value_2.eqNullSafe(df2.value_2)) &
(df1.value_3.eqNullSafe(df2.value_3)) &
(df1.value_4.eqNullSafe(df2.value_4))),
"leftanti" \
)
但不幸的是,我们现在必须处理一个包含大量列的动态列表。我们如何重写这个连接,使我们可以提供一个要连接的列的列表。
THX & BR
1条答案
按热度按时间hiz5n14c1#
就我对问题陈述的理解而言,您希望基于提供的列列表创建动态连接条件。我们可以使用
functools
模块中的reduce()
来实现这一点。您可以直接在
.join()
中使用join_condition
参数。