Spark 的 BloomFilter 的 bitSize 与给定的 bitSize 不匹配

问题描述 投票:0回答:1

我有两个关于将 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。是否可以使用不同的库加载输出二进制文件并期望在不同的库/应用程序中具有相同的可预测行为?

apache-spark databricks bloom-filter
1个回答
0
投票

您的输入的绽放位大小是建议的大小。 在内部,sparkbloom 使用这个初始位大小及其 BitArray,并且生成的 BitArray 用于返回位大小:

long bitSize() {
  return (long) data.length * Long.SIZE;
}

在重用方面,你可以直接重用BloomFilterImpl

© www.soinside.com 2019 - 2024. All rights reserved.