我正在实现使用遗漏连接从两个数据帧中删除重复元素的解决方案。执行连接条件后,我必须检查右表的空列。
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)
但是我无法过滤掉具有空值的整数列。如何在加入后对整数进行空检查?
答案 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()