如何在USQL中定义多个输入文件模式?
问题描述:
我有我需要处理一些数据的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个输入是不可能的,以决定应该阅读前几天的小时数。
我的问题是我怎样才能以方便的方式定义这个,理想情况下只使用一个提取语句?
答
您可以将您的逻辑封装到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"
)
这可能是去了解的一种方式?
在我的情况下,我想一起处理数据,所以不是创建表值函数的过程。但是这个原则与你的答案完全一样。 – viblo