【发布时间】:2023-03-26 19:04:02
【问题描述】:
我正在使用 Azure Synapse Serverless SQL 从包含历史数据的数据湖创建每日转储。为了创建当前的最新版本,我正在做一个 CETAS,在更新日期和加入列上加入(在下面的例子中 MS_ID 和 UPDDATE)
创建外部表的查询如下(如果有更新,主要数据按天分区,同一天有多个 parquet 文件)
由于我尝试获取列信息,实木复合地板上的实际列具有列类型。关于这个特定问题,因为 Azure Synapse 尝试在最终连接(或 nvarchar(8000) )中将 String 类型转换为 nvarchar(max) 我有资源限制。
"Execution fail against sql server. Sql error number: 65000. Error Message: This query cannot be executed due to current resource constraints."
问题是我该如何限制以便 Parquet 中的“任何”文本列可以被视为例如 nvarchar(1000) 而无需明确指定表列和类型?
CREATE EXTERNAL TABLE [staging].[new_external_table]
WITH (
LOCATION = 'staging_zone_table_directory',DATA_SOURCE = staging_zone_managed,
FILE_FORMAT = PARQUET_SNAPPY
)
AS
WITH
table_from_adsl as (
SELECT * , b.filepath(1) AS [partition_year], b.filepath(2) AS [partition_month], b.filepath(3) AS [day] FROM OPENROWSET(
BULK 'table_datalake_root_directory/year=*/month=*/day=*/*.parquet' ,
FORMAT = 'PARQUET',
DATA_SOURCE = 'datalake_container_connection',
MAXERRORS = 10
) AS b
),max_update_table as (
SELECT [MS_ID],MAX([UPDDATE]) max_upddate
FROM table_from_adsl
GROUP BY [MS_ID]
)
SELECT DISTINCT t1.*
FROM table_from_adsl t1
INNER JOIN max_update_table t2
on t1.[MS_ID]=t2.[MS_ID] AND t1.[UPDDATE] = t2.max_upddate
where partition_year>=2017
sp_describe_first_result_set 以上查询的输出如下:
【问题讨论】:
-
我认为你坚持声明所有列。
-
最终我放弃了无服务器 CETAS,转而使用 Spark 扫描文件,在途中添加了十进制转换、增量更新和完整的初始转储到专用池。有趣的是,Spark parquet 的输出设置为 nvarchar(4000) 而不是 8000
标签: tsql parquet azure-synapse external-tables