2016-02-14 90 views
2

我有两个DataFrame:ab。这是他们的样子:Spark Scala筛选器DataFrame其中值不在另一个DataFrame中

a 
------- 
v1 string 
v2 string 

roughly hundreds of millions rows 


b 
------- 
v2 string 

roughly tens of millions rows 

我想继续从行数据帧a其中v2b("v2")

我知道我可以使用左连接和过滤器,其中右侧为空或SparkSQL与“不在”构造。我敢打赌,有更好的方法。

+1

我已经发布了一个答案,但加盟+过滤器应该工作相当好!我认为在任何解决方案中,加入+过滤器的大部分工作都是不可避免的。 –

+0

是的,实际上SparkSQL工作得非常快。另外 - 它不是重复的 - 我需要负滤镜。 – devopslife

+0

请参阅http://stackoverflow.com/questions/29537564/spark-subtract-two-dataframes – keos

回答

1

使用PairRDDFunctions.subtractByKey

DEF subtractByKey [W](其他:RDD [(K,W)])(隐式为arg0:ClassTag [W]):RDD [(K,V)]

返回RDD,其中的键对不在其中。

(有变种,提供了分区控制。见docs。)

所以,你会做a.rdd.map { case (v1, v2) => (v2, v1) }.subtractByKey(b.rdd).toDF

+0

也许是纯粹的基于DataFrame的解决方案?我不使用DataFrames,抱歉。但跳回到RDD不应该太痛苦,使用'subtractByKey'并返回到DataFrames。 –

+1

你可以使用[except](https://spark.apache.org/docs/latest/api/scala/index.html#[email protected](other:org.apache.spark。 sql.Dataset [T]):org.apache.spark.sql.Dataset [T]) –

+0

啊,'除了'是完美的答案!想要将其作为单独的答案发布? –

1

可以实现,使用的Dataset,至极的except法“返回包含但不是在另一个数据集在这个数据集行的新数据集