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

Azure data factory 如何获取元数据顺序/对其输出进行排序?,azure-data-factory,azure-data-factory-2,Azure Data Factory,Azure Data Factory 2,我已经建立了一个DataFactory管道,它获取Azure Data Lake Storage Gen2中的文件列表,然后使用ForEach循环迭代每个文件 Im使用“获取元数据”活动生成文件列表,其输出的参数为“子项” 我希望确保列表(子项)始终按名称顺序排序。我的问题是子项的默认排序方法是什么,或者我可以手动排序吗 谢谢 "name": "GetMetadata", "description": "", "type":

我已经建立了一个DataFactory管道,它获取Azure Data Lake Storage Gen2中的文件列表,然后使用ForEach循环迭代每个文件

Im使用“获取元数据”活动生成文件列表,其输出的参数为“子项”

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

谢谢

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

不幸的是,没有办法对子项的顺序进行排序。我觉得这个要求很奇怪,您需要对文件进行排序的场景是什么?

您可能应该尝试重构您的流程,以利用Azure Data Factory(ADF)的真正优势之一,即并行处理的能力。如果您根据文件/日期/期间而不是
截断
,执行了
删除
,该怎么办

我确实得到了一个连续的过程来工作,使用一个数据库查找,一个带有
ORDER BY
子句的查询来对输出进行排序,以及一个
用于以顺序模式运行的每个
循环,但这与ADF的优点相反:


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

  • 从BLOB存储中获取项目列表
  • 应用自定义筛选(超出问题上下文的范围-只需跳过)
  • 应用一个查找活动,该活动基本上接收1的JSON表示。获取元数据活动,使用T-SQL存储过程对其进行解析,并将batk作为输入JSON的排序表表示形式返回(按降序排序)
  • 对于每个活动,从上到下遍历列表,从最近的日期文件夹开始,移动到最旧的日期文件夹
  • 您可以在下面找到:

    配置3中的查找活动。

    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
    

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

    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
    

    我正在尝试获取存储中文件夹中的所有文件,并对它们进行交互(当前使用get metadata->foreach)。我希望foreach循环按从最旧到最新的顺序循环文件。我已经命名的文件夹中的文件有日期放在,并想排序的这个日期(从最早到最新的)我试图实现的是两个管道。一个将视图复制到adls 2中的csv,下一个管道将获取文件列表并检查它们是否曾经访问过db。如果他们有,它会截断表并用csv替换它,并在加载历史记录中添加一行。逻辑看起来太复杂了,我会选择azure函数的方式。您是否在azure函数中使用逻辑,然后从adf调用它。如果不是的话,dataflow可能可以做你想做的事情,但是我对adf dataflow不是最有经验的。谢谢,这似乎是最好的选择。我已经创建了两个管道,它们可以工作,但不能保证排序将保持一致。要对getmetadata输出进行排序,我将调用azure函数。感谢您的回复。它不是一个需要排序的SQL查询,而是一个JSON数组,JSON数组是GetMetaData任务的输出。我想我可能有一个解决方案,就是使用Azure函数对这个JSON数组进行排序,但我需要首先进行调查。谢谢把记录放在数据库里,这样可以对它们进行排序。啊,你的意思是把列表存储在数据库里,然后在那里进行排序。我没有考虑这一点,将调查它!谢谢