Azure Data Lake中的U-SQL输出

时间:2017-03-06 22:32:45

标签: azure output azure-data-lake u-sql data-partitioning

如果我不知道表中包含多少个不同的键值,是否可以根据列值自动将表拆分为多个文件? 是否可以将键值放入文件名中?

3 个答案:

答案 0 :(得分:11)

这是我们的top ask(以前也是asked on 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的计算并提交它以将数据分区为两个文件。

答案 1 :(得分:1)

公共预览中有一项新功能:

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
将它们全部整合到一个简单的端到端示例”中找到。

答案 2 :(得分:0)

好问题!我很想知道Rys先生的回应。

道歉,但这只是答案的一半。

我的第一个想法是使用您的键值对ADL表进行分区。但是,如果潜在的WHERE子句不具有确定性,那么我不确定如何处理单独的输出。也许CROSS JOIN在每一个结果中....传递!

拥有一个带有动态代码的WHILE循环会很不错!

在MS论坛上查看关于动态输入数据集的这篇文章。就像一个FYI。

https://social.msdn.microsoft.com/Forums/en-US/aa475035-2d57-49b8-bdff-9cccc9c8b48f/usql-loading-a-dynamic-set-of-files?forum=AzureDataLake