在 Spark 2.0.0 中使用 stat.bloomFilter 过滤另一个数据帧

Yas*_*ash 5 scala bloom-filter apache-spark apache-spark-sql apache-spark-dataset

我有两个大型数据框 [a] 一个,其中包含由 id [b] 标识的所有事件。我想使用 spark 2.0.0 中的 stat.bloomFilter 实现基于 [b] 中的 id 过滤 [a]

但是我在数据集 API 中没有看到任何将布隆过滤器连接到数据框的操作 [a]

val in1 = spark.sparkContext.parallelize(List(0, 1, 2, 3, 4, 5))
val df1 = in1.map(x => (x, x+1, x+2)).toDF("c1", "c2", "c3")

val in2 = spark.sparkContext.parallelize(List(0, 1, 2))
val df2 = in2.map(x => (x)).toDF("c1")

val expectedNumItems: Long = 1000
val fpp: Double = 0.005

val sbf = df.stat.bloomFilter($"c1", expectedNumItems, fpp)
val sbf2 = df2.stat.bloomFilter($"c1", expectedNumItems, fpp)
Run Code Online (Sandbox Code Playgroud)

根据 df2 中的值过滤“df1”的最佳方法是什么?

谢谢!

zer*_*323 6

您可以使用 UDF:

def might_contain(f: org.apache.spark.util.sketch.BloomFilter) = udf((x: Int) => 
  if(x != null) f.mightContain(x) else false)

df1.where(might_contain(sbf2)($"C1"))
Run Code Online (Sandbox Code Playgroud)