【问题标题】:Add Azure Blob Partitions to Azure SQL Table将 Azure Blob 分区添加到 Azure SQL 表
【发布时间】:2021-10-29 03:56:08
【问题描述】:

我已将 Azure Blob 中的 parquet 文件分区,并将其复制到 Azure SQL。如何将分区名称放入 SQL 表中?

我已经想出了如何通过在复制活动的源数据部分添加一个附加列来将完整的文件路径放入 SQL 表中(图 1 和图 2),但我正试图弄清楚如何正则表达式完整的文件路径到分区名称 (202105)。

在复制活动中源数据的数据预览中,它显示了 time_period 列,其中仅包含分区名称(图 3)。但是当它出现在 SQL 中时,所有行都为 NULL(或者它是完整的文件路径,这取决于我是否在 Copy Activity 的源数据部分添加了 Additional Columns)。

图片 1:

图 2:

图 3:

我尝试在 Azure SQL 中将 time_period 的数据类型更改为 INT。我已经尝试解析$$FILEPATH,但我尝试过的都没有奏效。

我基本上是从头开始,因为我确信会有更好的选择。 额外背景here 可能还有here

类似于this

【问题讨论】:

    标签: sql-server azure azure-data-factory azure-sql


    【解决方案1】:

    正如 MS doc 中的 here 所述,您可以使用 enablePartitionDiscovery 功能。

    来源:分区文件:

    源数据集:

    刚刚提到了容器名称,将目录和文件字段留空。我们将在 Copy Activity 中使用 WildCard paths 过滤它们。

    根据您的文件路径在Copy Activity 中配置源代码:

    注意:您可以跳过第 4 步,即带有$$FILEPATH 的附加列,仅供参考。您可以删除此位,因为您已经使用 enablePartitionDiscovery 获得了准备好的列。

    对于要选择的单个文件夹,您将设置如下。

    通配符路径: sink / columnparts / time_period=202105 / *.parquet

    对于多个文件夹 time_period=202105 , time_period=202106 .....如上一个sinp中所见,设置如下。

    ** 将取代父文件夹中的任何文件夹columnparts

    通配符路径: sink / columnparts / ** / *.parquet

    分区根路径:这应该指向所有分区文件夹所在的父文件夹。

    在我的例子中:sink/columnparts

    启用分区发现时必须提供分区根路径。

    接收器:可选择更新现有表或创建一个新表。

    从 SQL DB 中查看: time_period 列包含值 202105

    time_period=202105/part-00004-fcbe0bf5-2c93-45f5-9bb2-2f9089a3e83a-c000.snappy.parquet
    

    如果您看到此错误:

    您有一个未更新的映射!在映射部分,您可以再次使用clearreset 架构和Import schema,以确保安全。 ?

    就我而言,它是附加列file_path

    --或--

    $$FILEPATH 是一个保留变量,你不能在表达式生成器或函数中使用它来操作。

    如果您可以在复制到 SQL DB 后合并一个步骤,即使用如下存储过程。

    path 列包含从$$FILEPATH 收到的完整文件路径,正如您已经管理的那样。 StoreParquetTest是SQL中创建的表sink

    CREATE PROCEDURE trimpath
    AS
        UPDATE StoreParquetTest
        SET path = SUBSTRING(path,(CHARINDEX('=',path) + 1), ((CHARINDEX('/',path) - CHARINDEX('=',path) -1)))
    GO
    

    现在您可以在复制活动后使用管道中的存储过程活动。

    【讨论】:

    • 感谢您的回答!有没有办法使用启用分区发现功能?
    • 当然,这是您可以使用的最佳方式,让我在上面也添加一下
    • 我收到这个错误说 ParquetColumnNotFound: ibb.co/HgNPwRb 。源数据集的文件结构是 root/source_name/partitions。因此,在您的示例中,我将源数据集的文件路径作为 sink/columnparts 并且“文件”字段为空。我也试过 sink/columnpats/**
    • sink/columnpats/** 以我为例。在你的情况下,你将不得不修改。 Wildcards Path 字段应指向镶木地板文件。我已经更新了更多详细的答案,请尝试让我知道
    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2018-08-14
    • 2016-08-14
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多