【问题标题】:How can I define multiple input file patterns in USQL?如何在 USQL 中定义多个输入文件模式?
【发布时间】:2017-10-21 00:48:59
【问题描述】:

我有需要处理一些数据的 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 个输入来决定应该读取前几天的小时数。

我的问题是如何以一种方便的方式定义它,最好只使用一个提取语句?

【问题讨论】:

    标签: azure azure-data-lake u-sql


    【解决方案1】:

    您可以将您的逻辑包装到一个 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"
        )
    

    这可能是解决问题的一种方法?

    【讨论】:

    • 就我而言,我想一起处理数据,所以我创建了一个表值函数,而不是一个过程。但原理和你的答案一模一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多