AWS Glue执行df.to_sql写入PostgreSQL时出现数值范围格式错误求助
解决AWS Glue中df.to_sql导入PostgreSQL时的
'h' format requires -32768 <= number <= 32767错误 这个错误的核心原因是数据类型不匹配:PostgreSQL的smallint类型(对应格式符'h')取值范围被限制在-32768到32767之间,但你的DataFrame里有超出该范围的数值,写入时触发了类型校验失败。
以下是具体处理方案:
定位问题列:先找出DataFrame中哪些列的数值超出smallint范围,用这段代码快速排查:
# 遍历所有数值型列,检查范围 for col in df.columns: if df[col].dtype in ['int16', 'int32', 'int64']: min_val = df[col].min() max_val = df[col].max() if min_val < -32768 or max_val > 32767: print(f"列 {col} 超出smallint范围: 最小值={min_val}, 最大值={max_val}")调整DataFrame数据类型:把超出范围的列从
int16(对应PostgreSQL的smallint)改成int32或int64,对应PostgreSQL的integer或bigint:# 将问题列转换为int32类型 df['问题列名'] = df['问题列名'].astype('int32')显式指定to_sql的dtype映射:如果不想修改DataFrame本身,可在
to_sql时强制指定列对应的PostgreSQL类型,避开smallint的限制:from sqlalchemy import types # 定义列类型映射,把问题列指定为integer dtype_mapping = { '问题列名': types.Integer() } df.to_sql( name='目标表名', con=你的数据库连接对象, if_exists='append', # 根据需求选择replace/append等 dtype=dtype_mapping )修改PostgreSQL目标表结构:直接把目标表中对应列的类型从
smallint改成integer或bigint,从根源解决范围限制:ALTER TABLE 目标表名 ALTER COLUMN 问题列名 TYPE integer;
内容的提问来源于stack exchange,提问作者AlmightyHeathcliff
相关产品推荐
相关产品推荐

