【问题标题】:U-SQL Output in Azure Data LakeAzure 数据湖中的 U-SQL 输出
【发布时间】:2017-07-26 23:39:28
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这是我们的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的计算前置,然后提交,就可以得到分成两个文件的数据。

    【讨论】:

    • 请提供“/output/genscript.usql”文件的脚本。
    • 嗨,Arron,我不确定您希望我提供什么。上面的脚本生成 genscript.usql 内容。
    • @x 数据集如何传递给外部 genscript.usql 文件?执行它的最佳方法是什么?数据工厂?
    • 您还必须将 @x 生成添加到脚本中(基本上将其合并到 @stmts 中,在语句中添加另一列,对于 OUTPUT 和 @x = 分配为空,您可以在 OUTPUT 的 ORDER BY 子句中使用它来生成生成脚本中语句的正确顺序。例如,您可以使用 ADF 或 PowerShell 进行编排。
    • ...然后对受影响的区域进行消毒并等待 2-4 周的愈合
    【解决方案2】:

    公共预览版中有一个新功能:

    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
    “将所有内容放在一个简单的端到端示例中”部分中找到。

    【讨论】:

      【解决方案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

      【讨论】:

      • 没错!使用光标或 while/for 循环很容易,但如果没有迭代,它在许多情况下都无法使用.....
      • 我不会说不可用。 USQL 是一种声明性语言,它允许您以灵活/可扩展的方式大规模并行化您的工作负载。迭代数据很慢,如果你需要这样做,你可能使用了错误的工具......它不适用于 Oracle 游标! :-)
      • 据我了解,在 Data Lake(没有数据工厂)中,不可能将行集编排到按键值分区的文件中。还是我错了?
      • 我也在考虑使用数据工厂基于数据的某种“文件拆分器” - 你找到解决方案了吗?
      • 还想知道是否有解决方案可以为每条记录输出 1 个文件?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      相关资源
      最近更新 更多