Azure数据工厂(ADFv2)-如何处理USQL作业中不同文件夹中的多个输入文件

时间:2018-10-31 13:28:57

标签: azure u-sql azure-data-factory-2

我们要求使用Azure数据工厂和USQL处理来自不同文件夹的多个文件。

这是我们拥有的文件夹结构

年->月->日

我们有一个用于每个日期的文件夹,例如1,2,3 ... 31。要求是从特定文件夹中读取文件,并将其传递给USQL进行分析处理。我们需要处理多个日期的数据。数据工厂中有什么方法可以读取多个文件夹中的数据。

示例:我需要读取特定月份的日期,1,7和10的数据。我不想读取该月的所有文件

如果您遇到了上述情况的解决方案,请告诉我们。

2 个答案:

答案 0 :(得分:2)

是的。您应该使用虚拟列。例: 您的文件只有column1和column2。

path1 = / yourFolder / 2018/11/1 / file.csv

path2 = / yourFolder / 2018/10/25 / file.csv

DECLARE date1 = new DateTime(2018,11,1);
DECLARE date2 = new DateTime(2018,10,25);
@inputData = EXTRACT column1 string,
column2 string, 
FileDate DateTime //this is virtual column
FROM "/yourFolder/{FileDate:yyyy}/{FileDate:MM}/{FileDate:dd}/file.csv"
USING Extractors.Text(delimiter:';',skipFirstNRows:1);
@res = SELECT * FROM @inputData WHERE FileDate == date1 AND FileDate ==date2;

这样,您可以使用虚拟列管理文件夹结构。 当然,如果要从某个日期范围等获取文件,则可以使用BETWEEN。 HTH

P.S。您可以将参数从ADF发送到USQL存储过程,我只是给出了一个如何使用特定文件的示例。

答案 1 :(得分:0)

以下代码有效。如上所述。

DECLARE EXTERNAL @startDate字符串=“ 2018-08-01”; //值将从ADF传递 DECLARE EXTERNAL @endDate字符串=“ 2018-08-31”; //值将从ADF传递

DECLARE @report_start_date DateTime = DateTime.ParseExact(@startDate,“ yyyy-MM-dd”,CultureInfo.InvariantCulture); 宣告@report_end_date DateTime = DateTime.ParseExact(@endDate,“ yyyy-MM-dd”,CultureInfo.InvariantCulture);

DECLARE @ INPUT_FILE = @ valueFromADF +“ / {date:yyyy} / {date:M} / {date:d} / {filename} .txt”;

@dataAsString =提取值字符串,日期DateTime来自@INPUT_FILE,使用Extractors.Text(delimiter:'\ n'); @dataAsStrings = SELECT * FROM @dataAsString在@report_start_date和@report_end_date之间的日期;