使用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
相关产品推荐
相关产品推荐

