Output U-SQL in Azure Data Lake

Sarebbe ansible dividere automaticamente una tabella in più file in base ai valori delle colonne se non so quanti valori chiave differenti contiene la tabella? È ansible inserire il valore della chiave nel nome del file?

Questa è la nostra domanda principale (e in precedenza è stata chiesta anche su stackoverflow :). Al momento stiamo lavorando e speriamo di averlo a disposizione entro l’estate.

Fino ad allora devi scrivere un generatore di script. Tendo ad usare U-SQL per generare lo script, ma potresti farlo con Powershell o T4, ecc.

Ecco un esempio:

Supponiamo che tu voglia scrivere i file per il name della colonna nella seguente tabella / set di righe @x :

 name | value1 | value2 -----+--------+------- A | 10 | 20 A | 11 | 21 B | 10 | 30 B | 100 | 200 

Dovresti scrivere uno script per generare lo script come il seguente:

 @x = SELECT * FROM (VALUES( "A", 10, 20), ("A", 11, 21), ("B", 10, 30), ("B", 100, 200)) AS T(name, value1, value2); // Generate the script to do partitioned output based on name column: @stmts = SELECT "OUTPUT (SELECT value1, value2 FROM @x WHERE name == \""+name+"\") TO \"/output/"+name+".csv\" USING Outputters.Csv();" AS output FROM (SELECT DISTINCT name FROM @x) AS x; OUTPUT @stmts TO "/output/genscript.usql" USING Outputters.Text(delimiter:' ', quoting:false); 

Quindi prendi genscript.usql , anteponete il calcolo di genscript.usql e genscript.usql per ottenere i dati partizionati nei due file.

Ottima domanda! Sarò interessato a vedere con cosa risponde il signor Rys.

Ci scusiamo, ma questa è solo una mezza risposta.

I miei primi pensieri sono di partizionare una tabella ADL usando il valore della chiave. Ma poi non sono sicuro di come gestiresti gli output separati se una potenziale clausola WHERE non è deterministica. Forse CROSS PARTECIPA in ogni risultato e …. passa!

Sarebbe bello avere un ciclo WHILE con qualche codice dinamico!

Dai un’occhiata a questo post sui forum MS che parla di set di dati di input dinamici. Proprio come una FYI.

https://social.msdn.microsoft.com/Forums/en-US/aa475035-2d57-49b8-bdff-9cccc9c8b48f/usql-loading-a-dynamic-set-of-files?forum=AzureDataLake

C’è una nuova funzione nell’anteprima pubblica:

 SET @@FeaturePreviews = "DataPartitionedOutput:on"; 

È ansible aggiungerlo all’inizio dello script e i dati di output possono essere partizionati dalla chiave scelta:

 SET @@FeaturePreviews = "DataPartitionedOutput:on"; @result = SELECT date.Hour AS hour, COUNT( * ) AS total, ANY_VALUE(message) AS sample_message, ANY_VALUE(stack_trace) AS sample_trace FROM @data WHERE date.Year == 2018 AND date.Month == 7 GROUP BY date.Hour HAVING COUNT( * ) > 80; OUTPUT @result TO "/output/parquetfiles-{hour}.csv" ORDER BY hour DESC, total DESC USING Outputters.Csv(outputHeader : true); 

Un altro esempio può essere trovato nell’articolo
Elabora più file che mai e usa Parquet con Azure Data Lake Analytics
sezione ” Mettere tutto insieme in un semplice esempio end-to-end “.