首页 文章

Azure Data Lake Analytics:使用U-SQL组合重叠持续时间

提问于
浏览
2

我想使用U-SQL从Azure Data Lake Store中放置的CSV数据中删除重叠持续时间,并将这些行组合在一起 . 数据集包含开始时间和结束时间,每个记录包含几个其他属性 . 这是一个例子:

Start Time - End Time - Usar Name
5:00 AM - 6:00 AM - ABC
5:00 AM - 6:00 AM - XYZ
8:00 AM - 9:00 AM - ABC
8:00 AM - 10:00 AM - ABC
10:00 AM - 2:00 PM - ABC
7:00 AM - 11:00 AM - ABC
9:00 AM - 11:00 AM - ABC
11:00 AM - 11:30 AM - ABC

删除重叠后,输出数据集将如下所示:

Start Time - End Time - Usar Name
5:00 AM - 6:00 AM - ABC
5:00 AM - 6:00 AM - XYZ
7:00 AM - 2:00 PM - ABC

请注意,CSV包含大量数据,并且包含几GB的大小 . 我试图解决这个问题,但没有运气 . 我想避免使用U-SQL用户定义的Azure Data Lake Analytics作业运算符,并在U-SQL中寻找一些有效的解决方案 .

1 回答

  • 1

    看起来您想要聚合提供重叠时间帧的行的所有数据?或者您想对其他列中的数据做什么?

    乍一看,我建议您使用用户定义的REDUCER或用户定义的聚合器,具体取决于您希望与其他数据实现的目标 .

    但是,我看到的一个问题是您可能需要一个定点递归来创建常见的重叠范围 . 不幸的是,在U-SQL(也没有Hive)中没有修复点递归,因为递归的递缩处理不能有效地完成 .

    UPDATE AFTER CLARIFICATION

    我认为这更容易 . 您只需按键值的最小值和结束的最大值和组:

    @r = EXTRACT begin DateTime, end DateTime,
                 data string
         FROM "/temp/ranges.txt"
         USING Extractors.Text(delimiter:'-');
    
    @r = SELECT MIN(begin) AS begin,
                MAX(end) AS end,
                data
         FROM @r
         GROUP BY data;
    
    OUTPUT @r
    TO "/temp/result.csv"
    USING Outputters.Csv();
    

    请注意,仅当您的范围在同一天且不超过午夜时才有效 .

    UPDATED WITH A SOLUTION THAT HANDLES DISJOINT RANGES FOR A USER 您可以使用用户定义的reducer解决它 . 以下博客文章解释了解决方案的详细信息,并提供了GitHub代码的链接:https://blogs.msdn.microsoft.com/mrys/2016/06/08/how-do-i-combine-overlapping-ranges-using-u-sql-introducing-u-sql-reducer-udos/

相关问题