2017-10-20 74 views
1

我有我需要處理一些數據的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個輸入是不可能的,以決定應該閱讀前幾天的小時數。

我的問題是我怎樣才能以方便的方式定義這個,理想情況下只使用一個提取語句?

回答

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

這可能是去了解的一種方式?

+1

在我的情況下,我想一起處理數據,所以不是創建表值函數的過程。但是這個原則與你的答案完全一樣。 – viblo

相關問題