2017-10-20 1 views
1

Ich habe U-SQL-Skript, wo ich einige Daten verarbeiten muss. Die Daten werden in einem Blob mit ~ 100 Dateien pro Tag in dieser Ordnerstruktur gespeichert:Wie kann ich mehrere Eingabedateimuster in USQL definieren?

Einen Tag Daten zu bekommen ist einfach, setzen Sie einfach einen Platzhalter am Ende und es wird alle Dateien für alle Stunden herausgreifen für den Tag.

Allerdings möchte ich in meinem Skript den aktuellen Tag und die letzten 2 Stunden des Vortages vorlesen. Die naive Art und Weise ist mit 3 Extrakt Aussagen in dieser Art und Weise:

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(); 

Aber in meinem Fall jede Extraktleitung ist sehr lang und kompliziert (~ 50 Spalten) mit dem AvroExtractor, so würde ich wirklich nur die Spalten angeben bevorzugen und Extraktor einmal statt 3 mal. Außerdem ist es mit 3 Eingängen nicht möglich von der Anruferseite zu entscheiden, wie viele Stunden von den vorhergehenden Tagen gelesen werden sollten.

Meine Frage ist, wie kann ich dies auf eine bequeme Art und Weise definieren, idealerweise mit nur einer Extrakt-Aussage?

Antwort

2

Sie können Ihre Logik in eine gespeicherte U-SQL-Prozedur einbetten, sodass sie gekapselt ist. Dann müssen Sie nur ein paar Anrufe zum Proc machen. Ein einfaches Beispiel:

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; 

Dann nennt es (nicht getestet):

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

, dass ein Weg, darüber zu gehen sein könnte?

+1

In meinem Fall wollte ich die Daten zusammen verarbeiten, also habe ich anstelle einer Prozedur eine Tabellenwertfunktion erstellt. Aber das Prinzip ist genau wie deine Antwort. – viblo

Verwandte Themen