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