Apache spark 整数类型列的联接null检查后触发数据帧

Apache spark 整数类型列的联接null检查后触发数据帧,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我正在实施使用left-out-join从两个数据帧中删除重复元素的解决方案。在执行连接条件之后,我必须检查正确表的空列 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)).t

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

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)

但我无法筛选出具有空值的整型列。我们如何在连接后对整数执行空检查?

不清楚您想要实现什么。这样做会产生模棱两可的列名。此外,在筛选条件中引用原始(源)数据帧(
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()

为什么要将
duration
(一个Int)转换为String?能否在问题中添加输入数据帧和预期的输出数据帧。谢谢,成功了。实际上,我正试图通过执行左外部联接并检查右DF中的null数据来删除两个数据帧中的公共行。@Vinod查看dataframes@Vinod或者使用unionAll,然后使用distinct,请参阅我的更新答案