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
相关产品推荐
相关产品推荐

