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

Azure Data Factory复制活动动态修改数据类型及INT96转日期列方案

解决Oracle转Parquet时日期列被识别为INT96的问题

方法1:使用Apache Spark处理

Spark读写Parquet时可手动指定Schema,强制将INT96类型映射为日期类型:

  • 从Oracle读取数据时,确保日期列类型正确识别:
from pyspark.sql import SparkSession
from pyspark.sql.types import DateType

spark = SparkSession.builder.appName("OracleToParquet").getOrCreate()

# 读取Oracle数据,自动识别原生日期类型
oracle_df = spark.read.format("jdbc") \
    .option("url", "jdbc:oracle:thin:@//your-oracle-host:1521/your-db") \
    .option("dbtable", "your_table") \
    .option("user", "your_user") \
    .option("password", "your_password") \
    .option("driver", "oracle.jdbc.driver.OracleDriver") \
    .load()

# 写入Parquet时指定日期格式,避免转为INT96
oracle_df.write.format("parquet") \
    .option("dateFormat", "yyyy-MM-dd") \
    .save("path/to/parquet/files")

若已生成INT96类型的Parquet文件,可重新读取转换:

# 读取现有Parquet,将INT96列转为日期类型
parquet_df = spark.read.parquet("path/to/existing/parquet")
converted_df = parquet_df.withColumn("your_date_col", parquet_df["your_date_col"].cast(DateType()))
converted_df.write.parquet("path/to/converted/parquet")

方法2:使用Pandas+PyArrow处理

通过自定义Schema控制Parquet的日期类型映射:

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

# 从Oracle读取数据,确保日期列是datetime类型
df = pd.read_sql("SELECT * FROM your_table", "oracle+cx_oracle://user:pass@host:port/dbname")

# 定义Schema,指定日期列用date32/date64类型替代INT96
schema = pa.schema([
    pa.field("col1", pa.string()),
    pa.field("your_date_col", pa.date32())
])

# 写入Parquet时应用自定义Schema
table = pa.Table.from_pandas(df, schema=schema)
pq.write_table(table, "path/to/output.parquet")

方法3:可视化ETL工具配置

若使用Talend、Informatica这类工具:

  • 读取Oracle数据源时,确认日期列被识别为原生日期/时间类型
  • 在Parquet写入步骤的字段映射或Schema配置面板,手动将对应列类型从INT96改为DATE或TIMESTAMP
  • 部分工具默认会把Oracle DATE映射为INT96,需在全局设置中关闭该自动转换规则

内容的提问来源于stack exchange,提问作者AzSurya Teja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:15:21