Dask用glob读取分区Parquet目录报IndexError,是否支持glob路径匹配?
问题解答
是否支持glob通配符?
dask + parquet + pyarrow 的技术组合完全支持glob通配符匹配路径,你遇到的报错属于路径解析或版本兼容问题,不是功能不支持。
报错原因
你写入数据时指定了partition_cols分区参数,所以你代码中data/{filename}.parquet实际是Hive分区格式的根目录,不是单个parquet文件。旧版本dask的pyarrow引擎在处理glob匹配到的多个分区根目录时,存在路径解析bug,会导致内部维护的路径列表为空,访问paths[0]时触发索引越界。
解决方案
按优先级从高到低可选以下方案:
- 直接读取父目录(最推荐)
你的所有分区数据都存放在data目录下,不需要使用glob通配符,直接传入父目录路径即可,dask会自动识别所有子分区目录,谓词下推规则也能正常生效:ddf= dd.read_parquet("data/", engine='pyarrow', gather_statistics=True, filters=[('STATION', '==', 'CA008202251'), ('ELEMENT', '==', 'TAVG')], columns=['TIME','ELEMENT','VALUE', 'STATION']) - 手动解析glob路径再传入
如果你确实需要通过glob筛选特定子目录(比如仅读取部分年份的分区),可以先用标准库glob拿到匹配的路径列表,再传给dask:import glob target_paths = glob.glob("data/*.parquet") ddf= dd.read_parquet(target_paths, engine='pyarrow', gather_statistics=True, filters=[('STATION', '==', 'CA008202251'), ('ELEMENT', '==', 'TAVG')], columns=['TIME','ELEMENT','VALUE', 'STATION']) - 升级dask版本
2023.1.0及以上版本的dask修复了glob匹配多分区目录的解析bug,升级后你原本的glob路径写法可以直接正常运行:pip install --upgrade dask pyarrow
内容的提问来源于stack exchange,提问作者Scott Syms
相关产品推荐
相关产品推荐

