Azure Databricks SQL Warehouse插入查询报错:布隆过滤器缓冲区非2的幂
解决Azure Databricks SQL Warehouse升级后INSERT查询报“Input buffer size 0 for bloom filter is not power of 2”错误
报错原因
Databricks SQL Warehouse 2023.15版本对分区插入的Bloom Filter优化逻辑做了调整:当INSERT语句的SELECT结果中存在空分区(即某个(project_id, simulation_id, scenario_id)组合没有对应数据)时,新版本的Bloom Filter初始化会尝试使用0作为缓冲区大小,但Bloom Filter的底层实现要求缓冲区大小必须是2的幂次,因此触发报错。而2023.10版本对空分区的Bloom Filter处理逻辑更宽松,不会触发该校验。
修复方案
- 临时禁用Bloom Filter优化:执行INSERT前先运行配置命令,绕过该逻辑:
之后再执行你的分区INSERT语句。SET spark.sql.sources.bucketing.bloomFilter.enabled = false; - 过滤空分区:在SELECT子句中添加过滤逻辑,排除掉没有数据的分区键组合。例如先查询出有数据的分区键,再关联原数据:
WITH valid_partitions AS ( SELECT project_id, simulation_id, scenario_id FROM [你的数据源表] GROUP BY project_id, simulation_id, scenario_id HAVING COUNT(*) > 0 ) INSERT INTO my_base.my_table PARTITION (project_id, simulation_id, scenario_id) SELECT t.* FROM [你的数据源表] t JOIN valid_partitions vp ON t.project_id = vp.project_id AND t.simulation_id = vp.simulation_id AND t.scenario_id = vp.scenario_id - 强制指定Bloom Filter预期条目数:设置一个大于0的2的幂次值,避免初始化时出现0:
SET spark.sql.sources.bucketing.bloomFilter.expectedNumItems = 1024; - 临时回退版本:若业务紧急,可将SQL Warehouse回退至2023.10版本,确保查询正常执行,同时等待官方修复。
排查方向
- 定位空分区:执行以下查询确认是否存在无数据的分区键组合:
SELECT project_id, simulation_id, scenario_id, COUNT(*) FROM [你的SELECT语句对应的数据源] GROUP BY project_id, simulation_id, scenario_id HAVING COUNT(*) = 0; - 对比版本变更:查阅Databricks官方文档,确认2023.10到2023.15版本中关于分区插入、Bloom Filter的功能变更,明确问题根源。
- 小批量测试:拆分原INSERT语句为多个小批次(比如每次插入10个分区),验证是否只有特定空分区会触发报错,缩小问题范围。
- 检查官方bug列表:确认该报错是否为2023.15版本的已知问题,是否有官方修复计划。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

