[英]Including null values in an Spark Join [Scala]
我有 2 个 dfs,我想对所有列进行内部联接
val seq1 = Seq((Some("1"), Some("Cat")), (Some("2"), Some("Dog")), (Some("3"), None))
val df1 = seq1.toDF("id", "name")
val s2 = Seq((Some("1"), Some("Cat")), (Some("2"), Some("Dog")), (Some("3"), None))
val df2 = s2.toDF("id", "name")
val s3 = Seq((Some("1"), Some("Cat")), (Some("2"), Some("Dog")), (Some("3"), None))
val df3 = s3.toDF("id", "name")
我希望df1.join(df2, df1.columns, "inner")
产生 df3,但现在它不包括("3", null)
。
我使用<=>
或.eqNullSafe
看到了一些答案,但我不确定如何将其应用于 Scala 代码。 我想要一个可以应用于任何 dfs 的通用解决方案 - 事先不知道列的名称。
我可以做类似df1.join(df2, df1.columns.map(c => col(c).eqNullSafe()): _*, "inner")
吗? 编译器不喜欢它,但这就是想法。
你可以像这样建立你的自定义连接条件:
val joinCondition = df1.columns.foldLeft(lit(true))((acc,c) => acc and (df1(c) === df2(c) or df1(c).isNull or df2(c).isNull))
df1.join(df2, joinCondition, "inner")
.select(df1("*"))
但是由于您的测试用例中的df2
为空,因此这仍然会导致结果为空。 您不能使用union
或简单地使用left-join
吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.