Get Metadata order/sort 是如何输出的?

How does Get Metadata order/sort its output?

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

我正在使用获取元数据 activity 生成文件列表,其输出的参数是 'Child Items'。

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

谢谢

            "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"
                ]
            }
        },

不幸的是,无法对 ChildItems 的顺序进行排序。我觉得这个要求很奇怪,你需要文件排序的场景是什么?

您可能应该尝试重构您的流程,以利用 Azure 数据工厂 (ADF) 的真正优势之一,即并行处理事物的能力。如果您根据文件/日期/期间而不是 TRUNCATE 执行 DELETE 怎么办?

我确实得到了一个顺序过程,它使用对数据库的查找、一个带有 ORDER BY 子句的查询来对输出进行排序,以及一个 For Each 循环 运行 在顺序中模式,但这与 ADF 的优势相反:

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

  1. 从 BLOB 存储中获取项目列表
  2. 应用自定义过滤(out-of-scope 在您的问题上下文中 - 跳过)
  3. 应用查找 activity,基本上接收 1 的 JSON 表示。获取元数据 activity,使用 T-SQL 存储过程和 [=50= 解析它] batk 作为输入 JSON 的排序 table 表示(以降序方式排序)
  4. 对于每个 activity 开始从上到下遍历列表,从最近的日期文件夹开始并移动到最旧的文件夹

下面你可以找到:

从 3.

查找 activity 的配置

T-SQL 将 Get Metadata activity 的输出转换为 ForEach activity.

的输入的存储过程
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