;with dtable as
(
select CONVERT(varchar(100),'@{pipeline().parameters.folders_s_date}', 111) as mydate
union all
select CONVERT(varchar(100), DATEADD(day,1,mydate), 111) from dtable
where datediff(day,CONVERT(varchar(100), DATEADD(day,1,mydate), 111),'@{pipeline().parameters.folders_end_date}')>=0
)
select concat('inputdata/year=',year(mydate),'/month=',PARSENAME( REPLACE(mydate,'/','.'),2),'/day=',PARSENAME( REPLACE(mydate,'/','.'),1)) as path from dtable option(MAXRECURSION 0)
1条答案
按热度按时间tf7tbtn21#
获取 meta数据活动不会给予完整的文件夹路径,即使您定义了通配符占位符。
如果你有更少的行数在整体上,你可以使用复制活动附加列的文件路径和合并所有文件,并将其保存在一个临时位置。稍后使用lookup activity,获取该列,您可以使用它的并集获得唯一列表。但是查找不会给予超过5000行的输出。
所以,我尝试了下面的方法来获取数组中的所有文件路径。
首先,我使用查找活动SQL脚本生成了文件夹路径数组(带日期)。
如果不想使用SQL数据库脚本,可以使用until activity,通过初始化开始日期和结束日期来获取日期的文件夹路径列表。
首先,通过文件夹路径,确定文件夹的开始日期和结束日期。将这些值赋给像这样的参数。
下面是我的文件夹结构:
根据我的文件夹结构,
2023/04/20
和2023/04/24
分别是开始日期和结束日期。我已经使用以下SLQ脚本从这个SO answer由@Joseph Xu在查找中获得文件夹路径数组。
这将给予如下的文件夹路径数组:
现在,将此数组传递给ForEach,并在ForEach内部使用带有parquet数据集的Get meta数据活动。使用数据集参数,在Get metadata活动中给出
@item().path
以获取子项(parquet文件)。这里,ADF目前不支持嵌套for Each,所以为了迭代子项,我使用了另一个带有Execute pipeline活动的管道,并将这些子项数组传递给它。
在子管道中,将子项文件名附加到文件夹路径并生成一个数组。将这个数组与
_
连接,并将结果作为字符串返回。在执行管道活动之后,我将返回结果与如下所示的字符串变量连接在一起。
在ForEach之外,我已经使用split将**字符串以
_
**分隔成一个数组并存储在变量中。父管道JSON:
子管道JSON:
路径数组:
您可以传递此数组For Each以实现您的要求。