在 Synapse 管道中,我尝试使用之前(从 Azure SQL 数据库)生成的 parquet 文件中的 CETAS 脚本活动。 源数据库有一些包含 LOB 列(xml 类型)的表,因此默认 varchar(8000) 类型不足以满足某些值。 我尝试定义列和类型:
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;
我的实际表有 24 列(不仅仅是上面脚本中的 2 列),但在运行脚本时收到此消息:
{
"errorCode": "2011",
"message": "Different number of columns in CREATE TABLE or CREATE EXTERNAL TABLE and SELECT query.",
"failureType": "UserError",
"target": "myScriptName",
"details": []
}
使用 parquet 文件查看器检查时,它确实包含 24 列,与我在 CETAS 脚本中传递的列定义完全相同。 parquet 文件中是否存在某种“隐藏”列?我应该用 24 列的确切列表替换“SELECT *”吗?
感谢您的帮助!
当我尝试使用下面的脚本复制问题时:
CREATE EXTERNAL TABLE myTable ([EMPLOYEE_ID] int, [FIRST_NAME] varchar(MAX))
WITH (
LOCATION = '<location>',
DATA_SOURCE = '<dataSource>',
FILE_FORMAT = <fileFormat>
)
AS
SELECT * FROM OPENROWSET(BULK 'employees.parquet',
FORMAT='PARQUET') AS f;
我遇到了类似的错误:
我使用以下脚本来解决该问题:
CREATE EXTERNAL TABLE dbo.emp (
[EMPLOYEE_ID] int,
[FIRST_NAME] varchar(MAX)
)
WITH (
LOCATION = '<location>',
DATA_SOURCE = <dataSource>,
FILE_FORMAT = <fileFormat>
)
脚本活动成功运行,没有任何错误:
已创建外部表:
如果你想从源中获取所有列,可以使用下面的代码:
SELECT *
FROM OPENROWSET(
BULK '<filePath>',
FORMAT='PARQUET'
) AS [dbo.employee];