Spark动态分区裁剪(DPP)不生效:两种Join场景的差异排查
Spark Iceberg场景下动态分区裁剪(DPP)生效差异问题
问题概述
使用Iceberg作为存储层时,大表T0与小表T1关联时出现动态分区裁剪(DPP)生效异常:直接关联广播后的T1时DPP不触发,但将T1数据收集到本地再重新构造DataFrame后关联,DPP正常生效。
场景1:DPP未生效的实现
df = spark.table('T0').select('A', 'B', 'C') df1 = spark.table('T1').select('A') df.join(F.broadcast(df1), ['A']).explain()
对应的执行计划关键片段:
BatchScan[...] T0 [filters=] RuntimeFilters: []
场景2:DPP生效的实现
values = [_.A for _ in df1.select('A').collect()] values_type = ArrayType(StringType()) df2 = spark.createDataFrame([values], values_type).select(F.explode('value').alias('A')) df.join(F.broadcast(df2), ['A']).explain()
对应的执行计划关键片段:
BatchScan[...] T0 [filters=] RuntimeFilters: [dynamicpruningexpression(A#5172 IN dynamicpruning#10343)]
已排查内容
- 排除了小表T1的
nullable属性影响:分别验证nullable = true和nullable = false两种情况,均无法触发DPP。
核心疑问
为什么两种关联方式会导致DPP生效情况不同?
内容的提问来源于stack exchange,提问作者Alex Loo
相关产品推荐
相关产品推荐

