You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Dask DataFrame设置整数列表类型列并写入Parquet?

解决Dask创建整数列表列并写入Parquet的问题

错误原因分析

  1. TypeError: list<item: int64> 不是Pandas/Dask可识别的 dtype 格式,导致apply方法无法解析元数据。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:23:16