手动创建分区Parquet文件后,能否用Polars的scan_parquet读取并获特性?
问题:手动创建Hive风格分区的Parquet文件能否用Polars的
scan_parquet(hive_partitioning=True)读取? 我未使用Python Polars库write_parquet()函数的partition_by参数,而是手动创建目录结构并写入Parquet文件,原因如下:
- 希望完全控制Parquet文件名
- 希望处理子目录中已有Parquet文件的情况(我会合并数据并去重)
想知道:即使文件是手动写入而非使用partition_by参数生成,能否使用设置hive_partitioning=True的pl.scan_parquet()函数,同时享受懒数据框过滤、并行读取和自动文件发现(使用glob模式)的特性?
回答
当然可以!只要你手动创建的目录结构完全符合Hive分区的规范(比如region=east/year=2024/sales_data.parquet这种分区列名=值的层级格式),Polars的pl.scan_parquet()开启hive_partitioning=True后就能正常识别分区,同时享受你提到的所有特性:
- 懒数据框过滤:Polars会根据你设置的分区键过滤条件,自动跳过不需要读取的分区目录,实现谓词下推,减少不必要的IO操作
- 并行读取:Polars会并行处理所有符合条件的Parquet文件,大幅提升大体积数据的读取效率
- 自动文件发现:只要传入正确的glob模式(比如
data/**/*.parquet),它就能自动遍历所有符合Hive分区结构的子目录,找到所有目标文件
需要注意的细节:
- 目录名格式必须严格遵循
分区列名=值的规则,不能有多余符号或格式错误,否则Polars无法识别分区信息 - 如果手动写入的Parquet文件本身已经包含了分区列的数据,可以设置
hive_partitioning='ingest',让Polars自动用目录中的分区值替换文件内的对应列数据,避免数据重复
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

