如何在 USQL 中定义多个输入文件模式?
How can I define multiple input file patterns in USQL?
我有 U-SQL 脚本,我需要在其中处理一些数据。数据存储在 blob 中,每天约有 100 个文件在此文件夹结构中:/{year}/{month}/{day}/{hour}/filenames.tsv
获取一天的数据很容易,只需在最后放一个通配符,它就会挑选出一天所有时间的所有文件。
但是,在我的脚本中,我想读出当天和前一天的最后 2 小时。天真的方法是以这种方式使用 3 个提取语句:
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();
但在我的例子中,使用 AvroExtractor 的每个提取行都非常长且复杂(~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"
)
这可能是一种解决方法?
我有 U-SQL 脚本,我需要在其中处理一些数据。数据存储在 blob 中,每天约有 100 个文件在此文件夹结构中:/{year}/{month}/{day}/{hour}/filenames.tsv
获取一天的数据很容易,只需在最后放一个通配符,它就会挑选出一天所有时间的所有文件。
但是,在我的脚本中,我想读出当天和前一天的最后 2 小时。天真的方法是以这种方式使用 3 个提取语句:
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();
但在我的例子中,使用 AvroExtractor 的每个提取行都非常长且复杂(~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"
)
这可能是一种解决方法?