【发布时间】:2017-07-26 23:39:28
【问题描述】:
如果我不知道表包含多少个不同的键值,是否可以根据列值自动将表拆分为多个文件? 是否可以将键值放入文件名中?
【问题讨论】:
标签: azure output azure-data-lake u-sql data-partitioning
如果我不知道表包含多少个不同的键值,是否可以根据列值自动将表拆分为多个文件? 是否可以将键值放入文件名中?
【问题讨论】:
标签: azure output azure-data-lake u-sql data-partitioning
这是我们的top ask(以前也是asked on stackoverflow :)。我们目前正在努力,希望能在夏天之前推出。
在此之前,您必须编写一个脚本生成器。我倾向于使用 U-SQL 来生成脚本,但你可以使用 Powershell 或 T4 等来生成。
这是一个例子:
假设您要为下表/行集@x 中的列name 写入文件:
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";
你可以在脚本开头添加,输出数据可以通过你选择的key进行分区:
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 论坛上讨论动态输入数据集的这篇文章。仅供参考。
【讨论】: