连接后的Spark数据帧检查整数类型列的空值

时间:2016-11-21 08:39:30

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

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

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)

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

1 个答案:

答案 0 :(得分:1)

相当不清楚你想要达到的目标。您的方式会创建不明确的列名称。此外,您在过滤条件中引用原始(源)数据框(right),而不是连接的数据框。

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

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

但不会导致任何" null"列,因为删除了重复的列。

+-----+----------+--------+
| 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()