我有两个关于将 BloomFilter 与 Spark 结合使用的问题。
我正在尝试使用 Spark 的
DataFrameStatFunctions
从 Databricks 15.4/Spark 3.5 中的 DataFrame 构建 BloomFilter。它创建的是一个 org.apache.spark.util.sketch.BloomFilter
实例。
val bfExpectedItems = <?>
val bfBitSize = 8L * 1024 * 1024 * 100
val bf1 = spark.sql("SELECT client_id FROM d_clientids WHERE updated_at > TIMESTAMP('2024-10-01')").stat.bloomFilter(
colName="client_id"
, expectedNumItems = bfExpectedItems
, numBits = bfBitSize
)
问题是
BloomFilter
的大小 (bitSize) 与给定的 numBits
: 不匹配
> bf1.bitSize
bf1: org.apache.spark.util.sketch.BloomFilter = org.apache.spark.util.sketch.BloomFilterImpl@e200002b
res3: Long = 67108864
这是为什么呢?我设置错了吗?
我的第二个问题是我想与其他(一些非 Spark)应用程序共享 BloomFilter。是否可以使用不同的库加载输出二进制文件并期望在不同的库/应用程序中具有相同的可预测行为?
您的输入的绽放位大小是建议的大小。 在内部,sparkbloom 使用这个初始位大小及其 BitArray,并且生成的 BitArray 用于返回位大小:
long bitSize() {
return (long) data.length * Long.SIZE;
}
在重用方面,你可以直接重用BloomFilterImpl。