Synapse外部表查询报错:INT类型与Parquet UTF8类型不兼容
问题解决:Synapse外部表类型不兼容报错
问题现象
查询外部表refine_table.FOREX_EOD时触发错误:
列'ASSET_TYPE_CODE'的INT类型与外部数据类型'Parquet physical type: BYTE_ARRAY, logical type: UTF8'不兼容,请尝试使用'VARCHAR(8000)'。
但Synapse数据流的数据预览调试结果显示正常。
原因分析
数据流预览会自动做类型兼容转换,但直接查询外部表时,Synapse会严格校验表定义结构与Parquet文件实际数据类型的匹配度。ASSET_TYPE_CODE列在Parquet文件中实际为字符串类型(BYTE_ARRAY+UTF8逻辑类型),但外部表定义时设为了INT,导致类型不匹配触发报错。
解决步骤
修改外部表列类型
执行以下DDL语句,将ASSET_TYPE_CODE列的类型调整为VARCHAR(8000):ALTER EXTERNAL TABLE refine_table.FOREX_EOD ALTER COLUMN ASSET_TYPE_CODE VARCHAR(8000);若为创建表时定义错误,直接重新创建外部表并将该列类型设为
VARCHAR(8000)即可。验证修复效果
修改完成后重新查询外部表,确认报错消失。按需做类型转换(可选)
如果业务需要将该列作为INT使用,可在查询时做显式转换,同时添加过滤条件避免转换失败:SELECT CAST(ASSET_TYPE_CODE AS INT) AS ASSET_TYPE_CODE FROM refine_table.FOREX_EOD WHERE ISNUMERIC(ASSET_TYPE_CODE) = 1;
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

