我正在处理spark中的两个架构,table1
和table2
:
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)
但是,我已经从不同的来源创建了这两个。基本上每个都持有(value
,user_id
)对的item_id
信息,这是浮点数据类型,因此容易出现浮点错误。例如,由于其他计算,一个表中的(1,3,4)可以作为(1,3,3.9999 ..)存储在另一个表中。
我需要从user_id
中移除item_id
,table1
对(保证成对唯一)的行,这些行也存在于table2
中。像这样:
scala> table1.except(table2)
然而,没有办法告诉除非它应该确定两行是相同的,在这种情况下只是(user_id
,item_id
)。我需要忽略value
。
如何使用spark-sql执行此操作?
答案 0 :(得分:4)
使用 leftanti join
将是一种可能的解决方案。这将删除左表中存在于给定键的右表中的行。
table1.join(table2, Seq("user_id", "item_id"), "leftanti")