Synapse中带列定义的CETAS读取Parquet文件失败排查求助
Synapse CETAS创建外部表列数不匹配问题解决
问题场景
在Synapse管道中使用CETAS脚本活动,从Azure SQL数据库生成的Parquet文件创建外部表。源表包含xml类型的LOB列,默认varchar(8000)无法容纳部分值,因此手动定义了24列及对应类型,但执行脚本时触发列数不匹配错误。
执行的SQL脚本
CREATE EXTERNAL TABLE myTable ([column1] int, [column2] varchar(MAX)) WITH ( LOCATION = 'myLocation', DATA_SOURCE = mySource, FILE_FORMAT = Parquet ) AS SELECT * FROM OPENROWSET(BULK 'myParquetFile.parquet', FORMAT='PARQUET') AS f;
错误信息
{ "errorCode": "2011", "message": "Different number of columns in CREATE TABLE or CREATE EXTERNAL TABLE and SELECT query.", "failureType": "UserError", "target": "myScriptName", "details": [] }
已通过Parquet文件查看器确认文件包含24列,与定义完全一致,疑问:Parquet是否存在隐藏列?是否需要将SELECT *替换为具体列列表?
解决方案
必须将
SELECT *替换为显式列列表
即使Parquet文件列数与外部表定义一致,SELECT *在OPENROWSET读取Parquet时,可能因列顺序、大小写敏感(如Parquet列名小写,外部表列名大写)或元数据解析差异,导致实际返回列与预期不匹配。显式指定列名既能避免列数不匹配问题,还能确保xml等LOB列的类型映射完全符合自定义规则(比如对应varchar(MAX))。关于Parquet隐藏列
标准Parquet格式无默认隐藏列,但部分ETL工具生成Parquet时可能添加自定义元数据列。不过你已确认文件列数为24,大概率不是此原因,但显式列列表可直接规避这类潜在问题。
内容的提问来源于stack exchange,提问作者Jean-Christophe Rat-Patron
相关产品推荐
相关产品推荐

