Synapse Analytics加载Parquet失败:INT字段被映射为UTF8报错
场景说明
现有数据同步链路为从本地部署的Oracle数据库提取数据存入Synapse专用池,已搭建Synapse管道实现两段式数据同步:
- 第一阶段:通过复制活动将Oracle数据以Parquet格式写入数据湖
- 第二阶段:通过第二个复制任务将生成的Parquet文件导入Synapse专用池
故障表现
Oracle侧数据抽取使用动态生成的查询语句,查询包含2个运行时生成的硬编码INT值。当前查询可正常执行,Parquet文件也可正常生成,但使用PolyBase或COPY命令将文件导入Synapse时会触发如下报错:
"errorCode": "2200",
"message": "ErrorCode=UserErrorSqlDWCopyCommandError,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=SQL DW Copy Command operation failed with error 'HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException: ',Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Data.SqlClient.SqlException,Message=HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException: ,Source=.Net SqlClient Data Provider,SqlErrorNumber=106000,Class=16,ErrorCode=-2146232060,State=1,Errors=[{Class=16,Number=106000,State=1,Message=HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException: ,},],'"
切换为Bulk insert模式可正常完成导入,但该模式处理大数据量时效率较低,不符合使用需求。
排查过程
- 复制活动的字段映射是基于目标数据库表定义动态生成的,通过创建独立复制任务做导入映射排查时,发现上述2个INT列在Parquet源侧被映射为UTF8类型,而接收器表对应字段类型为INT32
- 排除这两列后复制任务可正常执行,判定故障根因为复制活动无法在PolyBase/COPY模式下隐式将字符串类型转换为整数
字段映射异常情况如下:
生成Parquet文件的Oracle源查询中已经将这2个列显式转换为INT类型,查询语句如下:
SELECT t.* , CAST(419 AS INT) AS "Execution_id" , CAST(4832 AS INT) AS "Task_id" , TO_DATE('2022-07-05 14:40:34', 'YYYY-MM-DD HH24:MI:SS') AS "ProcessedDTS" , t.DEMUTDT AS "EffectiveDTS" FROM CBO.DRKASTR t WHERE DEMUTDT >= TO_DATE('2022-07-05 13:37:35', 'YYYY-MM-DD HH24:MI:SS');
目前已尝试在Oracle到Parquet的复制环节显式将两列映射为INT类型,仍无法解决问题。
待解决问题
如何配置才能避免这两列被错误识别为字符串类型,保障PolyBase/COPY命令的加载流程正常运行?
内容的提问来源于stack exchange,提问作者Koen van Wielink

