【问题标题】:Spark dataframe after join null check for integer type columns连接空值检查整数类型列后的 Spark 数据帧
【发布时间】:2023-03-03 13:49:01
【问题描述】:

我正在实施使用左连接从两个数据帧中删除重复元素的解决方案。执行连接条件后,我必须检查右表的空列。

val llist = Seq(("bob", "2015-01-13", 4), ("alice", "2015-04-23",10))
val left = llist.toDF("name","date","duration")
val right = Seq(("alice", "2015-04-23",10),("bob", "2015-04-23", 23)).toDF("name","date","duration")


val df = left.join(right , left("name") === right("name") &&
  left("date") === right("date") &&
  left("duration").cast(StringType) === right("duration").cast(StringType)
  ,"left_outer").filter(right("duration").isNull)

但我无法过滤掉具有空值的整数列。我们如何在 join 后对整数进行 null 检查?

【问题讨论】:

  • 为什么要把duration(这是一个Int)转换成String?
  • 您能否在问题中添加输入数据帧和预期的输出数据帧。

标签: apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

目前还不清楚您想要实现什么。您这样做的方式会创建模棱两可的列名。此外,您在过滤条件中引用了原始(源)数据框 (right),而不是连接的数据框。

如果你想加入他们,你可以这样做:

val df = left
      .join(right , Seq("name","date","duration"),"left_outer")

但不会导致任何“空”列,因为重复的列已被删除。

+-----+----------+--------+
| name|      date|duration|
+-----+----------+--------+
|  bob|2015-01-13|       4|
|alice|2015-04-23|      10|
+-----+----------+--------+

否则,你可以试试这个:

val df = left.as('left)
  .join(right.as('right) ,
          $"left.name" === $"right.name"
      and $"left.date" === $"right.date"
      and $"left.duration" === $"right.duration"
    ,"left_outer"
  )
  .filter($"right.duration".isNull)

这将导致

+----+----------+--------+----+----+--------+
|name|      date|duration|name|date|duration|
+----+----------+--------+----+----+--------+
| bob|2015-01-13|       4|null|null|    null|
+----+----------+--------+----+----+--------+

编辑:

如果您只想删除重复项,您可以这样做:

val df = left.unionAll(right).distinct()

【讨论】:

  • 谢谢,它成功了。实际上,我正在尝试通过左外连接和检查右 DF 中的空数据来删除两个数据框中的公共行。
  • @Vinod 查看数据帧的“例外”方法
  • @Vinod 或使用 unionAll 然后区分,请参阅我的更新答案
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2021-06-27
相关资源
最近更新 更多