如果我不知道表中包含多少个不同的键值,是否可以根据列值自动将表拆分为多个文件?是否可以将键值放入文件名中?
这是我们的top ask(以前也是asked on stackoverflow :)。我们目前正在研究它,希望在夏天之前提供它。
在此之前,您必须编写脚本生成器。我倾向于使用U-SQL来生成脚本,但你可以用Powershell或T4等来完成。
这是一个例子:
假设您要在下表/ rowset 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);
另一个例子可以在文章中找到 Process more files than ever and use Parquet with Azure Data Lake Analytics “将所有内容放在一个简单的端到端示例中”部分。
好问题!我很想知道Rys先生的回应。
道歉,但这只是答案的一半。
我的第一个想法是使用您的键值分区ADL表。但是,如果潜在的WHERE子句不具有确定性,那么我不确定如何处理单独的输出。也许CROSS JOIN在每一个结果和....传递!
有一个带有动态代码的WHILE循环会很不错!
在MS论坛上查看关于动态输入数据集的这篇文章。就像一个FYI。