在Azure的数据湖U型SQL输出在Azure的数据湖U型SQL输出(U-SQL Output in

2019-05-12 03:36发布

有没有可能到表自动分割成基于列值几个文件,如果我不知道该表中包含多少个不同的键值? 是否有可能把键值插入的文件名?

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