有没有可能到表自动分割成基于列值几个文件,如果我不知道该表中包含多少个不同的键值? 是否有可能把键值插入的文件名?
Answer 1:
这是我们的最高要求 (和之前已要求对计算器太:)。 目前,我们正在努力,并希望有它可在夏季。
在那之前,你必须写一个脚本生成。 我倾向于用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
,并提交给获得分成两个文件中的数据。
Answer 2:
有一个在公开预览版中的新功能:
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的数据分析湖
节“ 全部放在一起以简单的端至端的例子 ”。
Answer 3:
问得好! 我会有兴趣看看有什么RYS先生与响应。
道歉,但这只是一半的答案。
我的第一个想法是使用你的键值来划分的ADL表。 但后来我不知道你会如何处理,如果一个潜在的WHERE子句不确定性的独立输出。 也许CROSS JOIN在每一个结果,并通过....!
这将是很好,有一些动态代码WHILE循环!
看看在谈到有关动态输入数据集的MS论坛上这个帖子。 正如一个供参考。
https://social.msdn.microsoft.com/Forums/en-US/aa475035-2d57-49b8-bdff-9cccc9c8b48f/usql-loading-a-dynamic-set-of-files?forum=AzureDataLake
文章来源: U-SQL Output in Azure Data Lake