Pandas DataFrame写入Apache Iceberg表时数据类型不匹配报错
问题分析
目标Iceberg表的现有Schema中,open/high/low/close/adjustedclose列类型为bigint,而你传入的DataFrame中这些列被处理为decimal(13,10)类型;同时volume列也存在类型不匹配问题。AWS Wrangler的to_iceberg方法默认禁用Schema进化,检测到类型变更时会直接抛出错误。
解决方案
1. 启用Schema进化(推荐)
在to_iceberg调用中添加schema_evolution=True参数,允许Iceberg表自动兼容合法的Schema变更(比如从bigint到decimal(13,10)的类型升级,因为decimal可以完整覆盖bigint的数值范围):
wr.athena.to_iceberg( df=df, database='market_test', table='price', table_location='s3://blah', temp_path='s3://blah-temp', data_source='AwsDataCatalog', schema_evolution=True # 开启Schema进化 )
2. 修正DataFrame类型处理逻辑
你当前用apply将列转为Python原生Decimal对象,Pandas会将其存储为object dtype,可能导致Wrangler对数据类型的识别偏差。建议直接使用Pandas原生的Decimal dtype:
# 替换原有的apply转换代码 df['open'] = df['open'].astype('decimal(13,10)') df['high'] = df['high'].astype('decimal(13,10)') df['low'] = df['low'].astype('decimal(13,10)') df['close'] = df['close'].astype('decimal(13,10)') df['adjustedclose'] = df['adjustedclose'].astype('decimal(13,10)') # 同步修正volume列类型,确保与表的bigint匹配 df['volume'] = df['volume'].astype('Int64') # 使用可空整数类型避免空值兼容问题
3. 手动修改表Schema(可选)
如果不想依赖自动Schema进化,可以先通过Athena直接修改表结构:
ALTER TABLE market_test.price ALTER COLUMN open SET DATA TYPE decimal(13,10), ALTER COLUMN high SET DATA TYPE decimal(13,10), ALTER COLUMN low SET DATA TYPE decimal(13,10), ALTER COLUMN close SET DATA TYPE decimal(13,10), ALTER COLUMN adjustedclose SET DATA TYPE decimal(13,10);
修改完成后再执行Python写入代码即可。
内容的提问来源于stack exchange,提问作者user172839
相关产品推荐
相关产品推荐

