Azure Data Factory处理PostgreSQL中-infinity时间戳的问题
处理ADF中PostgreSQL timestamp字段的"-infinity"值问题
错误原因
这个long overflow错误是因为PostgreSQL的-infinity timestamp值超出了Spark/Java的时间处理范围(Java Timestamp类型的最小值远晚于0001-01-01),直接读取会触发数值溢出。
解决方法
1. PostgreSQL数据源层面预处理(推荐)
不直接读取原表,通过自定义SQL提前转换-infinity,避免ADF读取时触发错误:
- 转换为
0001-01-01 00:00:00的SQL示例:SELECT CASE WHEN your_timestamp_col = '-infinity'::timestamp THEN '0001-01-01 00:00:00'::timestamp ELSE your_timestamp_col END AS your_timestamp_col, -- 其他字段 FROM your_table - 转换为
null的SQL示例:SELECT NULLIF(your_timestamp_col, '-infinity'::timestamp) AS your_timestamp_col, -- 其他字段 FROM your_table
在ADF的PostgreSQL数据集中选择「查询」模式,填入上述SQL即可。
2. ADF数据流动处理
如果必须读取原表,可通过数据流动的派生列转换替换异常值:
- 源转换开启「允许Schema漂移」;
- 添加派生列转换,使用条件表达式处理目标字段:
- 转为指定时间:
iif(toString(your_timestamp_col) == '-infinity', toTimestamp('0001-01-01 00:00:00'), your_timestamp_col) - 转为null:
iif(toString(your_timestamp_col) == '-infinity', null(), your_timestamp_col)
- 转为指定时间:
注意:若直接读取原表预览就报错,可先通过自定义SQL将数据写入ADF临时存储(如Blob Storage),再用数据流动处理。
3. 修改JDBC连接参数(备选)
在PostgreSQL的JDBC连接字符串中添加驱动参数,自动将-infinity转为null:
jdbc:postgresql://your-host:5432/your-db?stringtype=unspecified&treat-infinity-as-null=true
该参数需依赖较新版本的PostgreSQL JDBC驱动支持。
内容的提问来源于stack exchange,提问作者Anna Melashkina
相关产品推荐
相关产品推荐

