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

使用awswrangler读写Parquet后DataFrame dtype(int64变Int64)不一致问题咨询

问题分析与解决方案

这不是bug,而是AWS Wrangler(awswrangler)的默认行为导致的类型转换,下面给你详细拆解原因和解决办法:

为什么会出现类型差异?

Parquet格式原生支持可空数值类型,而AWS Wrangler在写入Parquet文件时,默认会将pandas的非可空整数类型(比如int64)转换为Parquet的可空整数类型。当你从S3读回文件时,Wrangler会将Parquet的可空整数映射为pandas的Int64(带大写I的可空整数类型),这就导致了前后类型不一致,进而让两个DataFrame的相等性校验失败。

解决办法

你只需要在写入Parquet时,显式关闭可空类型的自动转换即可:

修改后的代码示例

import boto3
import awswrangler as wr
import pandas as pd

test_bucket = 'test-bucket'
test_data = 'test_data.parquet'
s3 = boto3.client('s3')

df1 = pd.DataFrame(
    [[1990, 1], [2000, 2], [1985, 6]], columns=["Feature1", "Feature2"]
)

# 关键:添加use_nullable_dtypes=False参数,保持原类型
wr.s3.to_parquet(df=df1, path=f"s3://{test_bucket}/{test_data}", use_nullable_dtypes=False)

raw_data_s3_objects = s3.list_objects(Bucket=test_bucket)
for path in raw_data_s3_objects["Contents"]:
    file_name = path["Key"]
    raw_dataset = wr.s3.read_parquet(path=f"s3://{test_bucket}/{file_name}")

# 现在验证类型和相等性
print("df1类型:\n", df1.dtypes)
print("raw_dataset类型:\n", raw_dataset.dtypes)
print("DataFrame是否相等:", df1.equals(raw_dataset))

补充说明

  • use_nullable_dtypes参数默认是True,这是Wrangler为了提升数据兼容性的设计(比如处理可能出现的空值场景),但如果你的数据确定没有空值,且需要严格保持原类型,就需要手动设置为False。
  • 如果你已经有写入好的Parquet文件,也可以在读回后通过raw_dataset = raw_dataset.astype('int64')强制转换类型,但这种方法不如从写入阶段控制来得稳妥。

内容的提问来源于stack exchange,提问作者natt010

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:52:28