2017-03-06 4 views
0

Ich muss Daten in Azure Data Lake verarbeiten. Mein Flow ist wie folgt:U-SQL-Cursor in Azure Data Lake

  1. Ich möchte aus der Datenbank Liste der IDs für die nächste Verarbeitung auszuwählen. Das habe ich getan.
  2. ich brauche durch IDs iterieren (aus dem ersten Schritt), und ich brauche nacheinander in getrennten Dateien Daten exportieren (partitioniert durch ID)

Das Problem wird folgende statemanet:

U- SQL-Prozeduren bieten keine imperativen Code-Flow-Konstrukte wie For oder While-Schleifen.

Haben Sie eine Idee, wie Sie Daten ähnlich wie mit dem Cursor verarbeiten?

Ich habe keine Dokumentation über die Cursor in U-SQL gefunden.

Vielen Dank!

+0

Dies ist das gleiche wie Ihre andere Frage. Ich wiederhole, USQL ist nicht zum Iterieren gedacht. –

+0

Ist nicht das gleiche, diese Frage bezieht sich auf den Cursor oder Schleifen und ähnliche Fälle (meine andere Frage bezieht sich auf die Dateipartitionierung). Das war ein Grund, warum ich die Fragen geteilt habe, weil ich gerne wissen würde, ob ein iterativer Ansatz möglich ist oder nicht, und in meiner anderen Frage würde ich gerne wissen, wie man Dateien nach Schlüsselwerten partitioniert. – peterko

Antwort

0

In U-SQL sind keine Cursor vorhanden, da die oben erwähnte Anweisung verwendet wird.

U-SQL bietet keine imperativen Code-Flow-Konstrukte, weil es die Optimierung des Skripts durch den Optimierer behindert.

Sie sollten daran denken, Ihr Problem deklarativ anzugehen. Wenn Sie beispielsweise eine Liste von IDs (entweder in einer Tabelle oder in SqlArray oder sogar in einer Datei) haben, verwenden Sie einen deklarativen Join. Zum Beispiel wollen Sie 42 zu jedem Wert hinzuzufügen, wo der Schlüssel in einer Liste der vorhandenen Schlüssel ist:

// Two options for providing the "looping data" 
// Option 1: Array Variable 
DECLARE @keys_var = new SqlArray<string>{"k1", "k2", "k3"}; 

// Option 2: Rowset (eg from an EXTRACT from file, a table or other place) 
@keys = SELECT * FROM (VALUES("k1"), ("k2"), ("k3")) AS T(key); 

// This is the data you want to iterate over to add 42 to the value column for every matching key 
@inputdata = SELECT * FROM (VALUES (1, "k1"), (2, "k1"), (3, "k2"), (6, "k5")) AS T(value, key); 

//Option 1: 
@res = SELECT value+42 AS newval, key FROM @inputdata WHERE @keys_var.Contains(key); 

OUTPUT @res TO "/output/opt1.csv" USING Outputters.Csv(); 

//Option 2: 
@res = SELECT value+42 AS newval, i.key 
    FROM @inputdata AS i INNER JOIN @keys AS k 
     ON i.key == k.key; 

OUTPUT @res TO "/output/opt2.csv" USING Outputters.Csv(); 

Jetzt in Ihrem Fall möchten Sie datengesteuerte Ausgabedatei Sätze haben. An dieser Funktion wird gerade gearbeitet (es ist eines unserer top asks). Bis dahin müssten Sie ein Skript schreiben, um das Skript zu generieren (ich werde ein Beispiel für Ihre andere Frage geben).

+0

Danke Michael. Könnten Sie bitte beschreiben, was Sie mit deklarativem Beitritt gemeint haben? Haben Sie ein Beispiel oder Tutorial? – peterko

+0

Aktualisiert oben. Beachten Sie, dass dies nicht für OUTPUT, sondern für die allgemeine Verarbeitung funktioniert. –

0

Wenn Sie wirklich iteratives Verhalten möchten, müssen Sie die USQL von PowerShell aufrufen.

Zum Beispiel:

ForEach ($Date in $Dates) 
    { 
    $USQLProcCall = '[dbo].[usp_OutputDailyAvgSpeed]("' + $Date + '");' 
    $JobName = 'Output daily avg dataset for ' + $Date 

    Write-Host $USQLProcCall 

    $job = Submit-AzureRmDataLakeAnalyticsJob ` 
     -Name $JobName ` 
     -AccountName $DLAnalyticsName ` 
     –Script $USQLProcCall ` 
     -DegreeOfParallelism $DLAnalyticsDoP 

    Write-Host "Job submitted for " $Date 
    } 

Quelle: https://www.purplefrogsystems.com/paul/2017/05/recursive-u-sql-with-powershell-u-sql-looping/

+0

Danke Paul. Ich löste es teilweise über Schleifen im Powershell-Workflow, der u-sql ausführt. Jetzt versuche ich Ihre Vorschläge. Danke vielmals! – peterko

Verwandte Themen