2017-10-20 207 views
1

我有我需要处理一些数据的U-SQL脚本。数据存储在blob中,每天在这个文件夹结构中有大约100个文件:/{year}/{month}/{day}/{hour}/filenames.tsv如何在USQL中定义多个输入文件模式?

获取一天的数据很容易,只需在最后放置一个通配符,它​​将在所有时间内挑选出所有文件当天。

但是,在我的脚本中,我想读出当天和前一天的最后2小时。用简单的方式就是以这种方式与3级摘录的语句:使用AvroExtractor

DECLARE @input1 = @"/data/2017/10/08/22/{*}.tsv"; 
DECLARE @input2 = @"/data/2017/10/08/23/{*}.tsv"; 
DECLARE @input3 = @"/data/2017/10/09/{*}.tsv"; 

@x1 = EXTRACT .... FROM @input1 USING Extractors.Tsv(); 
@x2 = EXTRACT .... FROM @input2 USING Extractors.Tsv(); 
@x3 = EXTRACT .... FROM @input3 USING Extractors.Tsv(); 

但在我的情况下,每个提取线很长且复杂的(〜50列),所以我真的宁愿是只指定列和提取器一次而不是3次。另外,通过从呼叫方那里获得3个输入是不可能的,以决定应该阅读前几天的小时数。

我的问题是我怎样才能以方便的方式定义这个,理想情况下只使用一个提取语句?

回答

2

您可以将您的逻辑封装到U-SQL存储过程中,以便将其封装起来。然后你只需要对proc进行一些调用。一个简单的例子:

CREATE PROCEDURE IF NOT EXISTS main.getContent(@inputPath string, @outputPath string) 
AS 
BEGIN; 

    @output = 
     EXTRACT 
     ... 
     FROM @inputPath 
     USING Extractors.Tsv(); 


    OUTPUT @output 
    TO @outputPath 
    USING Outputters.Tsv(); 

END; 

然后调用它(未经):

main.getContent (
    @"/data/2017/10/08/22/{*}.tsv", 
    @"/output/output1.tsv" 
    ) 

main.getContent (
    @"/data/2017/10/08/23/{*}.tsv", 
    @"/output/output2.tsv" 
    ) 

main.getContent (
    @"/data/2017/10/09/{*}.tsv", 
    @"/output/output3.tsv" 
    ) 

这可能是去了解的一种方式?

+1

在我的情况下,我想一起处理数据,所以不是创建表值函数的过程。但是这个原则与你的答案完全一样。 – viblo

相关问题