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

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


person peterko    schedule 06.03.2017    source источник


Ответы (3)


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

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

Вот пример:

Предположим, вы хотите записать файлы для столбца name в следующей таблице/наборе строк @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, добавляете вычисление @x и отправляете его, чтобы данные были разделены на два файла.

person Michael Rys    schedule 08.03.2017
comment
Предоставьте сценарий для файла /output/genscript.usql. - person Arron; 24.07.2017
comment
Привет, Аррон, я не уверен, что ты хочешь, чтобы я предоставил. Приведенный выше скрипт генерирует содержимое genscript.usql. - person Michael Rys; 18.08.2017
comment
Как набор данных @x передается во внешний файл genscript.usql? Каков наилучший способ его выполнения? Фабрика данных? - person coltonfranco; 23.09.2017
comment
Вам также нужно будет добавить генерацию @x в сценарий (в основном, объединить его в @stmts, добавить еще один столбец в оператор, который является нулевым для OUTPUT и @x = для назначений, которые вы можете использовать в OUTPUT's Предложение ORDER BY для создания правильного порядка операторов в сгенерированном скрипте.Вы можете организовать это, например, с помощью ADF или PowerShell. - person Michael Rys; 05.10.2017
comment
...и после этого стерилизовать пораженный участок и оставить на 2-4 недели для заживления - person Alex Gordon; 06.09.2019

В общедоступной предварительной версии появилась новая функция:

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

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

person ilanak    schedule 30.08.2018

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

Извините, но это только половина ответа.

Мои первые мысли — разделить таблицу 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

person Paul Andrew    schedule 07.03.2017
comment
Точно! С курсором или циклом while/for это простая задача, но без итераций она непригодна для многих сценариев..... - person peterko; 07.03.2017
comment
Я бы не стал говорить о непригодности. USQL — это декларативный язык, который позволяет вам массово распараллеливать ваши рабочие нагрузки гибким/масштабируемым способом. Перебор данных происходит медленно, и если вам нужно это сделать, вы, вероятно, используете неправильный инструмент... Это не для курсоров Oracle! :-) - person Paul Andrew; 07.03.2017
comment
Как я понял, в озере данных (без фабрики данных) невозможно организовать набор строк в файлы, разбитые по ключевому значению. Или я ошибаюсь? - person peterko; 07.03.2017
comment
Я также думал о каком-то разделителе файлов на основе данных с использованием Data Factory - вы нашли решение? - person Rodney; 25.06.2018
comment
хотел бы также знать, есть ли решение для вывода 1 файла на запись? - person Alex Gordon; 17.09.2019