Parquet,从具有特定列的所有文件中选择

问题描述 投票:0回答:1

我需要“选择不同的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 阶段? 也就是说,如果该文件中存在列,则接受该文件?

sql azure parquet serverless openrowset
1个回答
0
投票

在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;

来源:文档

© www.soinside.com 2019 - 2024. All rights reserved.