如何查询Arrow数据集元数据?是否支持按行分组分区?
Apache Arrow Dataset行组分区与元数据查询解决方案
能力支持说明
Apache Arrow Dataset完全支持按行组拆分分区,以及读取行组级别的最大值、最小值等统计元数据的需求,你之前的调用逻辑未正确获取子分片的元数据,因此未拿到预期结果。
现有代码问题说明
你调用的split_by_row_group()方法的作用是将单个文件分片(Fragment)拆分为多个对应文件内行组的子分片,本身不会直接返回元数据,需要遍历拆分后的子分片读取其metadata属性才能拿到行组统计信息。
正确实现示例
import pyarrow.dataset as ds # 替换为你的数据集路径,格式根据实际存储调整为parquet/orc dataset = ds.dataset("your_dataset_path", format="parquet") for fragment in dataset.get_fragments(): # 按行组拆分当前分片 row_group_fragments = fragment.split_by_row_group() for rg_frag in row_group_fragments: # 获取当前行组的全量元数据 rg_metadata = rg_frag.metadata print(f"当前行组总行数:{rg_metadata.num_rows}") # 遍历所有列获取最大最小值统计 for col_name in dataset.schema.names: col_stats = rg_metadata.statistics[col_name] if col_stats.has_min_max: print(f"列{col_name} 最小值:{col_stats.min} 最大值:{col_stats.max}")
注意事项
- 该能力仅支持Parquet、ORC等自带行组统计元数据的存储格式,CSV等纯文本格式无行组统计能力,无法使用该功能。
- 自行写入数据集时需显式开启统计写入配置,并设置合理的行组大小,才能生成包含最大、最小值统计的行组元数据,写入配置示例如下:
ds.write_dataset( data, base_dir="output_dataset_path", format=ds.ParquetFileFormat(write_statistics=True), min_rows_per_group=10000, max_rows_per_group=100000 ) - Arrow Dataset查询引擎默认支持行组裁剪能力,你无需手动拆分行组过滤,直接在查询时传入过滤条件即可自动跳过不满足条件的行组,大幅提升查询效率,示例:
dataset.to_table(filter=ds.field("age")>18)。
内容的提问来源于stack exchange,提问作者Abhishek Malik
相关产品推荐
相关产品推荐

