如何为Dask DataFrame设置整数列表类型列并写入Parquet?
解决Dask创建整数列表列并写入Parquet的问题
错误原因分析
- TypeError:
list<item: int64>不是Pandas/Dask可识别的 dtype 格式,导致apply方法无法解析元数据。 - ValueError: Dask自动推断的schema将
alist列误判为int64,但实际数据是整数列表,与Parquet期望的类型不匹配,导致写入失败。
正确实现步骤
1. 导入依赖库
import dask.dataframe as dd import pandas as pd import pyarrow as pa
2. 创建示例Dask DataFrame
ddf = dd.from_pandas(pd.DataFrame({ 'id': [1, 2, 3, 4, 5], 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emma'], 'age': [25, 30, 35, 40, 45] }), npartitions=1)
3. 正确创建整数列表列
有两种可靠方式指定元数据:
方式一:使用Object类型作为元数据
适合快速实现,后续写入时手动指定schema:
ddf["alist"] = ddf.apply( lambda k: [1, 0, 0], axis=1, meta=("alist", "object") )
方式二:使用Arrow列表类型作为元数据
让Dask直接识别列的正确类型,减少后续schema适配工作:
ddf["alist"] = ddf.apply( lambda k: [1, 0, 0], axis=1, meta=("alist", pd.ArrowDtype(pa.list_(pa.int64()))) )
4. 写入Parquet文件
手动构建匹配的PyArrow Schema,确保类型一致:
# 定义匹配的schema schema = pa.schema([ ('id', pa.int64()), ('name', pa.large_string()), ('age', pa.int64()), ('alist', pa.list_(pa.int64())) ]) # 写入Parquet ddf.to_parquet( "example", engine="pyarrow", compression="snappy", overwrite=True, schema=schema )
关键说明
- 元数据(
meta)必须使用Pandas/Dask可识别的类型:要么用通用的object类型,要么用pd.ArrowDtype包裹PyArrow的列表类型。 - 写入Parquet时手动指定schema是确保类型匹配的关键,避免Dask自动推断出错。
内容的提问来源于stack exchange,提问作者Joost Döbken
相关产品推荐
相关产品推荐

