scala - 在 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)
.
<=>
我看到了一些使用or的答案,.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
?
推荐阅读
- gmail-api - 我可以使用 Gmail API 访问同一域中其他用户的邮件列表和设置吗?
- javascript - 在角度 6 中为服务中分配的数据获取未定义
- python - 进程pyqt的进度条
- android - 如何在面向 API 级别 26+ 及以下的 NativeScript 中实现 Android 后台服务
- r - updateTabsetPanel 在 Shiny 应用程序中的嵌套 tabsetPanel 之间导航
- python - 如何编写生成 1,000 次随机掷骰并显示结果直方图的程序
- java - 如何在我的 RPG 游戏中回到某个检查点?
- kubernetes - 如果我想让它与 aws EKS 一起使用,应该为 iam 用户分配什么策略
- javascript - 将滚动事件监听器添加到 GatsbyJS (ReactJS) 中的文档
- docker - 为什么我必须删除 docker 容器?