首页 文章

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

提问于
浏览
1

我有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个输入来决定应该读取前几天的小时数 .

我的问题是如何以方便的方式定义它,理想情况下只使用一个提取语句?

1 回答

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

    那可能是一种方法呢?

相关问题