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

Zob*_*san 5 scala apache-spark apache-spark-sql

我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

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

我需要删除带有 ( user_id, item_id) 对(保证成对唯一)的行,table1这些行也存在于table2. 像这样的东西:

scala> table1.except(table2)
Run Code Online (Sandbox Code Playgroud)

但是,除了何时应该确定两行相同之外,没有其他方法可以判断,在这种情况下只是 ( user_id, item_id)。我需要无视value这一点。

如何使用 spark-sql 做到这一点?

Sha*_*ica 6

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

table1.join(table2, Seq("user_id", "item_id"), "leftanti")
Run Code Online (Sandbox Code Playgroud)