我需要“选择不同的COLUMN_X” 来自所有具有“COLUMN_X”的镶木地板文件
我尝试将 OPENROWSET 与 sys.tables 和 sys.columns 结合起来 但失败并显示“列不存在” 看来JOIN操作是在文件打开(OPENROWSET)之后进行的
SELECT distinct COLUMN_X
FROM OPENROWSET(
BULK 'db/schema/*/**'
, FORMAT = 'PARQUET', DATA_SOURCE= 'datalake' ) x
inner join sys.tables t on t.name= x.filepath(1)
where exists ( select 1
from sys.columns c
where c.object_id= t.object_id
and c.name= 'COLUMN_X' )
是否可以根据文件元数据过滤 OPENROWSET 阶段? 也就是说,如果该文件中存在列,则接受该文件?
在synapse serverless中,具有BULK操作的OPENROWSET函数不支持在文件选择阶段基于文件元数据进行动态过滤。 OPENROWSET 函数按原样对文件进行操作,并在文件打开后进行过滤。这就是为什么您当前使用 JOIN 与 sys.tables 和 sys.columns 的方法无法按预期工作的原因。
下面的查询将根据外部表定义提供的元数据执行,并且应该只从与架构匹配的文件中进行选择。
定义一个外部表并使其与文件的确切架构匹配,例如此语句(这不是 CETAS):
CREATE EXTERNAL TABLE X
(
COLUMN_X datatype,
# and all other columns with datatypes
)
USING (
LOCATION = 'db/schema',
DATA_SOURCE = 'datalake',
FILE_FORMAT = (TYPE = 'PARQUET')
);
SELECT DISTINCT COLUMN_X
FROM X;
来源:文档