0

我在 Azure Blob 中对 parquet 文件进行了分区,并将其复制到 Azure SQL。如何将分区名称放入 SQL 表中?

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

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

图 1: 使用 $$FILEPATH 的图 1

图 2: 文件路径设置参数的图 2

图 3: 显示该列显示在预览中

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

我基本上是从头开始,因为我确信有更好的。这里和可能这里有额外的背景。

此类似

4

1 回答 1

0

如MS doc 中所述,您可以使用功能enablePartitionDiscovery

来源:分区文件:

在此处输入图像描述

源数据集:

刚刚提到了容器名称,并将目录和文件字段留空。我们将WildCard paths在复制活动中过滤它们。

在此处输入图像描述

Copy Activity根据您的文件路径配置源:

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

在此处输入图像描述

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

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

对于多个文件夹time_period=202105time_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 后合并一个步骤,即使用如下存储过程。

where columnpath包含$$FILEPATH您已经管理的完整文件路径。StoreParquetTest是在 SQL 中创建的表sink

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

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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

于 2021-10-11T15:31:56.663 回答