如何在Apache Spark中基于列的子集实现`except`?

时间:2018-03-14 05:36:43

标签: scala apache-spark apache-spark-sql

我正在处理spark中的两个架构,table1table2

scala> table1.printSchema
root
 |-- user_id: long (nullable = true)
 |-- item_id: long (nullable = true)
 |-- value: double (nullable = true)

scala> table2.printSchema
root
 |-- item_id: long (nullable = true)
 |-- user_id: long (nullable = true)
 |-- value: double (nullable = true)

但是,我已经从不同的来源创建了这两个。基本上每个都持有(valueuser_id)对的item_id信息,这是浮点数据类型,因此容易出现浮点错误。例如,由于其他计算,一个表中的(1,3,4)可以作为(1,3,3.9999 ..)存储在另一个表中。

我需要从user_id中移除item_idtable1对(保证成对唯一)的行,这些行也存在于table2中。像这样:

scala> table1.except(table2)

然而,没有办法告诉除非它应该确定两行是相同的,在这种情况下只是(user_iditem_id)。我需要忽略value

如何使用spark-sql执行此操作?

1 个答案:

答案 0 :(得分:4)

使用 leftanti join将是一种可能的解决方案。这将删除左表中存在于给定键的右表中的行。

table1.join(table2, Seq("user_id", "item_id"), "leftanti")