sparksql parquet执行filter的时候没有用谓词下推--------坑

生产sparksql。对于时序性数据,执行速度很慢,定位思路: sparksql配置---------》各个执行时间段消耗明细----------》差异

 

spark.read.parquet(hdfsPath: _*).createOrReplaceTempView(modelCode)

下楼.filter(_.length > 0) parquet执行filter的时候没有用谓词下推,导致加载所有的partition数据
spark.read.parquet(hdfsPath: _*).filter(_.length > 0).createOrReplaceTempView(modelCode)

@ref
https://blog.csdn.net/strongyoung88/article/details/81156271
https://stackoverflow.com/questions/51001692/parquet-filter-pushdown-is-not-working-with-spark-dataset-api
https://stackoverflow.com/questions/50129411/why-is-predicate-pushdown-not-used-in-typed-dataset-api-vs-untyped-dataframe-ap

sparksql 对于parquet执行谓词下推的原理:
parquet文件结构
parquet文件包括 header,dataBlock,Footor

dataBlock 又由多个 row group组成, 而每个rowGroup 又由多个列存储构成, 每个列 又分成多个page 每个page又分data page 和dictionary page,字符串和数值的映射对 这样便于过滤

Footor 由File metaData ,Footor Length,Magic Number 构成;
File metaData 由schema 和rowGroup metaData 构成 rowGroupMeta data中有类似 min max的值,这样 有 > <这样的操作时,可以直接根据这些metadata来决定是否加载该数据块

posted @ 2021-04-28 09:08  清明雨下  阅读(354)  评论(0)    收藏  举报