使用dask_cudf读取Parquet文件遇NotImplementedError: large_string求助
解决dask_cudf读取Parquet时的large_string报错问题
问题原因
报错NotImplementedError: large_string是因为当前版本的cudf对Parquet中的large_string类型(尤其是带时区的时间戳字符串)支持不完善,而pandas/pyarrow对该类型的兼容性更好。
可行解决办法
强制指定列类型读取
读取时将Date字段先指定为字符串类型,再转换为cudf支持的带时区datetime类型:import dask_cudf # 先以字符串类型读取Date列 df = dask_cudf.read_parquet("path/to/your/files.parquet", dtype={"Date": "str"}) # 转换为UTC时区的datetime类型 df["Date"] = dask_cudf.to_datetime(df["Date"], utc=True)若明确知道字段类型,也可直接指定为cudf支持的datetime类型:
from cudf import datetime64 df = dask_cudf.read_parquet("path/to/your/files.parquet", dtype={"Date": datetime64[ns, "UTC"]})先通过pandas后端读取再转换
利用pandas对large_string的兼容性,先读取为dask-pandas数据框,再转换为dask_cudf对象:import dask.dataframe as dd import dask_cudf # 使用pyarrow引擎以pandas后端读取 df_pd = dd.read_parquet("path/to/your/files.parquet", engine="pyarrow") # 转换为dask_cudf数据框 df_cudf = dask_cudf.from_dask_dataframe(df_pd)注意:若单文件内存占用过高,需确保机器内存足够,或调整dask的分块参数。
预处理Parquet文件转换字段类型
用pyarrow将原文件中的Date字段转换为标准带时区的timestamp类型后重新写入,再用dask_cudf读取:import pyarrow.parquet as pq import pyarrow as pa # 读取原Parquet文件为pyarrow表 table = pq.read_table("path/to/original_file.parquet") # 定位Date字段并转换类型为UTC时区的timestamp date_idx = table.schema.get_field_index("Date") table = table.set_column( date_idx, "Date", pa.array(table["Date"], type=pa.timestamp('ns', tz='UTC')) ) # 写入处理后的Parquet文件 pq.write_table(table, "path/to/processed_file.parquet")处理后的文件可直接用dask_cudf正常读取。
升级依赖版本
新版本的cudf/dask_cudf可能已修复large_string类型的支持问题,尝试升级到最新稳定版:pip install --upgrade cudf dask-cudf pyarrow
内容的提问来源于stack exchange,提问作者stucash
相关产品推荐
相关产品推荐

