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

使用PySpark向Redshift写入数据时ORA-01722错误的解决方法

解决写入Redshift时出现ORA-01722无效数字错误的方案

先排查错误根源

ORA-01722是Oracle专属错误,但你是写入Redshift,所以优先确认两个核心点:

  1. 你的Redshift表是否存在触发器、物化视图、UDF或外部表关联Oracle?如果有,写入Redshift时会触发Oracle端的操作,此时需要检查这些关联逻辑中的类型转换是否存在无效数字问题。
  2. 确认Redshift连接配置是否正确:检查redshift_url是否是Redshift的JDBC地址(格式应为jdbc:redshift://<集群端点>:<端口>/<数据库>),是否误配置成了Oracle的URL。

针对性解决方案

方案1:改用Redshift专用数据源写入

通用JDBC驱动在处理Redshift临时S3文件交互时容易出现类型兼容问题,建议使用Spark Redshift专用数据源:

# 确保环境已引入com.databricks.spark.redshift依赖
selected_df.write \
    .format("com.databricks.spark.redshift") \
    .option("url", redshift_url) \
    .option("dbtable", redshift_table) \
    .option("user", redshift_user) \
    .option("password", redshift_password) \
    .option("tempdir", "s3://glue-temp/") \
    .mode("overwrite") \
    .save()

方案2:修正Decimal转字符串的格式,避免科学计数法

Oracle的Decimal类型转字符串可能生成科学计数法格式,若Redshift端存在隐式类型转换(比如约束或关联操作)会触发错误,改用format_number确保格式为常规数字字符串:

from pyspark.sql.functions import format_number, coalesce, lit

for col_name in selected_df.schema.names:
    selected_df = selected_df.withColumn(
        col_name, 
        coalesce(format_number(selected_df[col_name], 10), lit(""))
    )

方案3:排查转换后的数据是否存在异常值

采样查看转换后的DataFrame,确认是否有无法被Redshift处理的异常字符串:

selected_df.sample(0.1).show(100, truncate=False)

如果发现存在非数字格式的异常值(比如包含字母、特殊符号),需要在转换前过滤或清洗这些数据。

方案4:检查Redshift表的完整DDL

你提供的DDL缺少结尾的右括号,确认表的列类型确实是character varying(256),且没有隐藏的CHECK约束(比如要求列必须为数字格式)。若存在此类约束,需调整约束逻辑或确保写入的数据符合要求。


内容的提问来源于stack exchange,提问作者Shabari nath k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:15:11