正如 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
如果您看到此错误:
您有一个未更新的映射!在映射部分,您可以再次使用clear 或reset 架构和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
现在您可以在复制活动后使用管道中的存储过程活动。