gpt4 book ai didi

azure - 如何在 USQL 中定义多个输入文件模式?

转载 作者:行者123 更新时间:2023-12-03 01:45:53 25 4
gpt4 key购买 nike

我有 U-SQL 脚本,需要在其中处理一些数据。数据存储在 blob 中,此文件夹结构中每天约有 100 个文件:/{year}/{month}/{day}/{hour}/filenames.tsv

获取一天的数据很容易,只需在末尾添加通配符,它​​就会挑选出当天所有时间的所有文件。

但是,在我的脚本中,我想读出当天和前一天的最后 2 小时。最简单的方法是使用 3 个 extract 语句,如下所示:

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 存储过程中,以便将其封装。然后你只需要对这个过程进行几次调用。一个简单的例子:

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"
)

这可能是一种解决方法?

关于azure - 如何在 USQL 中定义多个输入文件模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com