获取元数据如何对其输出进行排序/排序?

rob*_*ber 5 azure-data-factory

我设置了一个 DataFactory 管道,用于获取 Azure Data Lake Storage Gen2 中的文件列表,然后使用 ForEach 循环迭代每个文件。

我使用“获取元数据”活动来生成文件列表,其输出的参数是“子项目”。

我想确保列表(子项目)始终按名称顺序排序。我的问题是子项目的默认排序方法是什么,或者我可以手动排序吗?

谢谢

            "name": "GetMetadata",
            "description": "",
            "type": "GetMetadata",
            "dependsOn": [
                {
                    "activity": "Execute Previous Activity",
                    "dependencyConditions": [
                        "Succeeded"
                    ]
                }
            ],
            "policy": {
                "timeout": "7.00:00:00",
                "retry": 0,
                "retryIntervalInSeconds": 30,
                "secureOutput": false,
                "secureInput": false
            },
            "userProperties": [],
            "typeProperties": {
                "dataset": {
                    "referenceName": "Folder",
                    "type": "DatasetReference"
                },
                "fieldList": [
                    "childItems"
                ]
            }
        },
Run Code Online (Sandbox Code Playgroud)

kam*_*et_ 6

我实施了以下解决方案来克服在不使用 Azure Functions 的情况下获取元数据默认排序顺序的问题:

ADF管道设计

  1. 从 BLOB 存储中获取项目列表
  2. 应用自定义过滤(超出您的问题上下文范围 - 只需跳过)
  3. 应用查找活动,该活动基本上接收 1. Get Metadata 活动的 JSON 表示形式,使用 T-SQL 存储过程对其进行解析,并返回 batk 作为输入 JSON 的排序表表示形式(以降序方式排序)
  4. 对于每个活动,开始从上到下迭代列表,从最近的日期文件夹开始,移到最旧的文件夹

您可以在下面找到:

3. 查找活动的配置

3. 查找活动的配置

将 Get Metadata 活动的输出转换为 ForEach 活动的输入的 T-SQL 存储过程。

ALTER PROCEDURE Tech.spSortBlobMetadata 
     @Json     NVARCHAR(MAX)
   , @SortOder VARCHAR(5)    = 'DESC'
   , @Debug    INT           = 0
AS

/***************************************************************************
     EXEC Tech.spSortBlobMetadata 
       '[{"name":"dt=2020-06-17","type":"Folder"},{"name":"dt=2020-06-18"}]'
       , 'DESC'
       , 1
***************************************************************************/



    BEGIN

        DECLARE 
             @sqlTransform NVARCHAR(MAX) = 'SELECT *
FROM OPENJSON(@Json) WITH(name NVARCHAR(200) ''$.name'', type NVARCHAR(50) ''$.type'')
ORDER BY name ' + @SortOder



        IF @Debug = 0
            BEGIN


                EXEC sp_executesql 
                   @sqlTransform
                 , N'@Json nvarchar(max)'
                 , @json = @json
        END
            ELSE
            BEGIN
                SELECT @sqlTransform
        END


    END
Run Code Online (Sandbox Code Playgroud)