2017-08-18 2 views
1

Ich versuche, eine dynamische FROM-Klausel in U-SQL zu generieren, so dass wir Daten aus verschiedenen Dateien basierend auf einem vorherigen Abfrageergebnis extrahieren können. Das ist so etwas wie diese:Dynamische FROM in U-SQL-Anweisung

@filesToExtract = SELECT whatevergeneratesthepaths from @foo; <-- this query generates a rowset with all the file we want to extract like: [/path/file1.csv, /path/file2.csv] 
SELECT * FROM @filesToExtract; <-- here we want to extract the data from file1 and file2 

Ich habe Angst, dass diese Art von Dynamik-Abfragen werden noch nicht unterstützt, aber kann jemand helfen mich wegweisend dies zu erreichen? Es scheint, dass der einzige gangbare Ansatz darin besteht, ein anderes U-SQL-Skript zu generieren und anschließend auszuführen.

Vielen Dank im Voraus.

Antwort

2

Es ist nicht ganz klar aus Ihrer Frage, wenn Sie möchten, dass die Dateinamen dynamisch abgerufen und an eine EXTRACT-Anweisung oder den Namen von Tabellen/Rowsets übergeben und an die FROM-Klausel von SELECT übergeben werden. Oder beides.

Im Allgemeinen können Sie keine Quellennamen dynamisch aus Ihrem U-SQL-Ausdruck generieren. Eventuell möchten Sie hier eine Feature-Anfrage http://aka.ms/adlfeedback für dynamisch oder statisch parametrierbare Quellen ablegen.

Nachdem dies gesagt wurde, kann es je nach Ihren genauen Anforderungen einige Möglichkeiten geben, Ihre Ziele zu erreichen, ohne die von Ihnen beschriebene Umgehung.

Zum Beispiel könnten Sie Ihren Code als parametrisierte Tabellenwertfunktion schreiben und dann die verschiedenen Rowsets mit verschiedenen Skripten übergeben, oder - wenn Sie statisch entscheiden können, welches Rowset Sie wählen sollen - können Sie die IF-Anweisung verwenden.

Hier ist ein Pseudo-Code Beispiel:

DECLARE EXTERNAL @someconditionparameter Boolean = true; 

IF (@someconditionparameter) THEN 
    @data = EXTRACT a int, b string FROM @fileset1 USING Extractors.Csv(); 
ELSE 
    @data = EXTRACT a int, b string FROM @file2 USING ...; 
END; 

@results = MyTableValuedFunction (@data); 
... 

Wenn Ihre Dateien unterschiedlich schematisiert sind, können Sie in der Lage sein, flexible Spaltensätze zu verwenden (derzeit in der Vorschau, Notizen siehe Release) in der TVF das zu handhaben Variabilität des Rowset-Schemas.

+0

Vielen Dank für Ihre schnelle Antwort. Auch wenn es mir ziemlich interessant erscheint, fürchte ich, dass es nicht das ist, wonach ich suche. Um zu verdeutlichen, was ich tun möchte, ist "Wählen", welche Dateien ich je nach einer vorherigen Abfrage extrahieren werde. Angenommen, ich habe die Dateipfade einiger Dateien im Data-Lake-Store in der Datenbank gespeichert. Ich würde gerne eine Reihe von Dateien laden, die eine Bedingung erfüllen (wie ein Zustand oder etwas). Ich hoffe, meine Frage ist jetzt klarer, sowieso werde ich eine Feature-Anfrage in der Uservoice-Link, die Sie mir gesendet haben, vorbringen. Nochmals vielen Dank für Ihre Zeit und Mühe. Grüße. – jsanchez

+0

@jsanchez Ich bin mir immer noch nicht sicher. Verfügen die Dateipfade über ein Muster, für das Sie eine Dateigruppe angeben können? Sind die Zustände Teil des Dateinamens oder des Inhalts der Dateien? Haben sie dasselbe Schema oder andere Schemata? Wenn Sie beispielsweise Dateien haben, die in ein Muster passen, und Sie nur Dateien lesen möchten, die mit einem bestimmten Pfad übereinstimmen, den Sie parametrisieren möchten, können Sie Dateigruppen verwenden und die virtuellen Spalten abfragen. Dadurch wird die Auswahl in den Extraktor verschoben und nur Dateien gelesen, die den Abfragen entsprechen. –