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 的情况下获取元数据默认排序顺序的问题:
- 从 BLOB 存储中获取项目列表
- 应用自定义过滤(out-of-scope 在您的问题上下文中 - 跳过)
- 应用查找 activity,基本上接收 1 的 JSON 表示。获取元数据 activity,使用 T-SQL 存储过程和 [=50= 解析它] batk 作为输入 JSON 的排序 table 表示(以降序方式排序)
- 对于每个 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
我已经设置了一个 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 的情况下获取元数据默认排序顺序的问题:
- 从 BLOB 存储中获取项目列表
- 应用自定义过滤(out-of-scope 在您的问题上下文中 - 跳过)
- 应用查找 activity,基本上接收 1 的 JSON 表示。获取元数据 activity,使用 T-SQL 存储过程和 [=50= 解析它] batk 作为输入 JSON 的排序 table 表示(以降序方式排序)
- 对于每个 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