Выход U-SQL в Azure Data Lake

Можно ли автоматически разбивать таблицу на несколько файлов на основе значений столбцов, если я не знаю, сколько разных значений ключа содержится в таблице? Можно ли поместить ключевое значение в имя файла?

Это наш главный вопрос (и ранее был задан вопрос о stackoverflow :). В настоящее время мы работаем над этим и надеемся, что он будет доступен к лету.

До этого вам нужно написать генератор сценариев. Я использую U-SQL для создания сценария, но вы можете сделать это с помощью Powershell или T4 и т. Д.

Вот пример:

Предположим, вы хотите записать файлы для имени столбца в следующей таблице / rowset @x :

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

Вы должны написать сценарий для генерации скрипта следующим образом:

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

Затем вы берете genscript.usql , genscript.usql вычисление @x и отправляете его, чтобы получить данные, разделенные на два файла.

Отличный вопрос! Мне будет интересно узнать, что отвечает г-н Рис.

Извинения, но это всего лишь половина ответа.

Мои первые мысли состоят в том, чтобы разбить таблицу ADL, используя ваше значение ключа. Но тогда я не уверен, как вы будете иметь дело с отдельными выходами, если потенциальное предложение WHERE не является детерминированным. Может быть, CROSS JOIN в каждом результате и … проходите!

Было бы неплохо иметь цикл WHILE с некоторым динамическим кодом!

Ознакомьтесь с этой публикацией на форумах MS, где рассказывается о динамических наборах входных данных. Так же, как FYI.

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

В публичном превью есть новая функция:

 SET @@FeaturePreviews = "DataPartitionedOutput:on"; 

Вы можете добавить его в начале скрипта, а выходные данные можно разделить на выбранный вами ключ:

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

Другой пример можно найти в статье
Обработайте больше файлов, чем когда-либо, и используйте паркет с Azure Data Lake Analytics
раздел « Объединим все вместе в простом сквозном примере ».

Давайте будем гением компьютера.