Можно ли автоматически разбить таблицу на несколько файлов на основе значений столбцов, если я не знаю, сколько различных значений ключей содержится в таблице? Можно ли поместить значение ключа в имя файла?
Вывод U-SQL в Azure Data Lake
Ответы (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
и отправляете его, чтобы данные были разделены на два файла.
В общедоступной предварительной версии появилась новая функция:
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
раздел "Собираем все вместе в простой сквозной пример".
Отличный вопрос! Мне будет интересно посмотреть, что ответит мистер Рысь.
Извините, но это только половина ответа.
Мои первые мысли — разделить таблицу ADL, используя значение вашего ключа. Но тогда я не уверен, как бы вы справились с отдельными выходами, если потенциальное предложение WHERE не является детерминированным. Может быть, CROSS JOIN в каждом результате и .... пройти!
Было бы неплохо иметь цикл WHILE с динамическим кодом!
Посмотрите этот пост на форумах MS, в котором рассказывается о динамических наборах входных данных. Так же, как FYI.