将Azure Blob分区添加到Azure SQL表 [英] Add Azure Blob Partitions to Azure SQL Table
问题描述
我在Azure Blob中对拼图文件进行了分区,并将其复制到Azure SQL。如何将分区名称放入SQL表?
我已经知道如何通过在复制活动(图1和图2)的源数据部分中添加一个额外的列来将完整的文件路径放入SQL表中,但我正在尝试如何将完整的文件路径向下仅表示为分区名(202105)。
在复制活动中的源数据的数据预览中,它显示了仅带有分区名称的time_Period列(图3)。但是,当它在SQL中显示时,它对于所有行都是空的(或者它是完整的文件路径,这取决于我是否在复制活动的源数据部分添加了额外的列)。
我已尝试在Azure SQL中将Time_Period的数据类型更改为int。我已尝试分析$$FILEPATH
,但均未奏效。
我基本上是从头开始,因为我相信有更好的办法。 额外的背景here和可能的here。
类似于this
推荐答案
如here在MS文档中所述,您可以使用enablePartitionDiscovery
功能。
来源:分区文件:
源数据集:
刚才提到了容器名称,并将目录和文件字段留空。我们将在复制活动中使用WildCard paths
筛选它们。
根据您的文件路径在Copy Activity
中配置源代码:
注意:您可以跳过步骤4,即添加$$FILEPATH
一栏,仅供参考。您可以删除此位,因为您已经使用enablePartitionDiscovery
获取了Ready列。
对于要拾取的单个文件夹,您需要如下设置。
通配符路径:sink / columnparts / time_period=202105 / *.parquet
time_period=202105
,time_period=202106
.....如前面的SINP所示,设置如下。**
将取代父文件夹中的任何文件夹columnparts
通配符路径:sink / columnparts / ** / *.parquet
分区根路径:该路径应指向所有分区文件夹所在的父文件夹。
在我的示例中:sink/columnparts
启用分区发现时必须提供分区根路径。
接收器:可选更新现有表或仅创建新表。
从SQL数据库查看:time_period
列保存值202105
time_period=202105/part-00004-fcbe0bf5-2c93-45f5-9bb2-2f9089a3e83a-c000.snappy.parquet
如果您看到此错误:
您的映射未更新!在映射部分中,您可以再次使用clear
或reset
模式和Import schema
,以确保这一点。😊
在我的案例中,它是附加栏file_path
--OR--
$$FILEPATH
是保留变量,不能在表达式生成器或函数中使用它进行操作。
相反,如果您可以在复制到SQL DB后合并一个步骤,即如下所示使用存储过程。
WHERE列path
保存您已经管理过的从$$FILEPATH
接收的完整文件路径。StoreParquetTest
是在SQL中创建的表sink
CREATE PROCEDURE trimpath
AS
UPDATE StoreParquetTest
SET path = SUBSTRING(path,(CHARINDEX('=',path) + 1), ((CHARINDEX('/',path) - CHARINDEX('=',path) -1)))
GO
现在您可以在复制活动之后使用管道中的存储过程活动。
这篇关于将Azure Blob分区添加到Azure SQL表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!