ADF通过Polybase将Parquet导入SQL DW时遇recordReaderFillBuffer错误
解决ADF Copy Data Activity导入INT96类型Parquet datetime到SQL DW的Polybase错误
错误根源
这个PolybaseOperationFailed(错误码106000)引发的ClassCastException,核心原因是Parquet文件中INT96类型的datetime字段与SQL Data Warehouse的datetime类型不兼容,且Copy Data Activity未配置显式字段映射,导致Polybase自动类型转换失败。INT96是Parquet用于存储带纳秒精度timestamp的特殊格式,而SQL DW的datetime仅支持毫秒精度,默认自动转换无法识别INT96的二进制结构。
解决方案
1. 配置显式字段映射并强制类型转换
在Copy Data Activity中手动定义字段映射,将INT96类型的源字段转换为SQL DW兼容的datetime类型:
- 打开Copy Data Activity的映射标签页,关闭「自动映射」
- 找到对应的datetime字段,源列选择Parquet中的INT96字段,目标列选择SQL DW表的
datetime字段 - 在转换表达式中使用ADF内置函数处理INT96类型:
若需截断纳秒匹配SQL DW的toDateTime(fromTimestamp(your_int96_column_name))datetime精度,可补充处理:date_trunc('millisecond', toDateTime(fromTimestamp(your_int96_column_name)))
2. 提前转换Parquet的datetime存储格式(可选)
如果原始层Parquet文件可修改,在ADF写入Parquet时,将datetime字段存储为标准timestamp类型而非INT96:
- 在写入Parquet的Copy Activity中,配置映射时将源datetime字段的目标类型指定为
timestamp,后续导入SQL DW时无需额外转换。
3. 手动定义Polybase外部表(高级方案)
若自动生成的外部表类型映射错误,可手动创建外部表指定INT96字段的正确转换逻辑:
- 在SQL DW中创建外部数据源指向Parquet存储路径
- 创建外部表时,将INT96类型字段定义为
TIMESTAMP,并通过FORMAT_OPTIONS指定Parquet类型处理:
之后使用Copy Data Activity从该外部表加载数据到目标表,规避自动映射的类型错误。CREATE EXTERNAL TABLE staging.your_table ( your_datetime_col TIMESTAMP ) WITH ( LOCATION = '/path/to/parquet/', DATA_SOURCE = your_external_data_source, FILE_FORMAT = your_parquet_file_format )
内容的提问来源于stack exchange,提问作者Saurabh Mehta
相关产品推荐
相关产品推荐

