Dask调用dd.read_csv加include_path_column参数报IndexError问题
报错诱因
该报错是旧版本Dask的已知功能缺陷,触发逻辑如下:
- 当
dd.read_csv传入include_path_column=True参数时,Dask会为每个分片记录对应的源文件路径,内部通过分片索引i读取存储所有匹配文件的paths列表内容 - 适配Python3.6的Dask版本(对应你使用的azureml_py36环境)存在逻辑bug:分片索引计算值超过了
paths列表的实际长度,调用self.paths[i]时触发列表越界 - 额外触发场景:data目录下存在0字节的空CSV文件,Dask处理空文件时未正确跳过,也会导致索引计算错误
可行解决方案
- 方案1:升级Dask版本
该bug已在Dask 2021.06.0及后续版本修复,如可升级Python环境,直接升级Dask即可解决:# pip安装 pip install dask[dataframe] --upgrade # conda安装 conda install dask>=2021.06.0 - 方案2:手动添加路径列(兼容Python3.6旧环境)
如无法升级Dask版本,可绕过include_path_column参数,手动遍历文件逐个读取并添加路径列:import dask.dataframe as dd import glob csv_paths = glob.glob("data/*.csv") df_list = [] for p in csv_paths: tmp_df = dd.read_csv(p) tmp_df["source_path"] = p df_list.append(tmp_df) df = dd.concat(df_list) - 方案3:清理无效文件
先遍历data目录删除所有0字节的空CSV文件,再重新运行原始代码,部分场景下也可解决问题。
内容的提问来源于stack exchange,提问作者Pruthvi Amin
相关产品推荐
相关产品推荐

