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 的大小。我正在尝试解决这个问题,但没有运气。我想避免为 Azure Data Lake Analytics 作业使用 U-SQL 用户定义的运算符,并从 U-SQL 中寻找一些有效的解决方案。

4

1 回答 1

1

看起来您想汇总提供重叠时间范围的行的所有数据?或者您想对其他列中的数据做什么?

乍一看,我建议您使用用户定义的 REDUCER 或用户定义的聚合器,具体取决于您想用其他数据实现什么。

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

澄清后更新

我认为这更容易。您只需取开头的最小值和结尾的最大值,然后按键值分组:

@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();

请注意,仅当您的范围在同一天并且不跨越午夜时,这才有效。

使用为用户处理不相交范围的解决方案进行了更新 您可以使用用户定义的减速器来解决它。以下博客文章解释了解决方案的详细信息并提供了 GitHub 代码的链接:https ://blogs.msdn.microsoft.com/mrys/2016/06/08/how-do-i-combine-overlapping-ranges-使用-u-sql-introducing-u-sql-reducer-udos/

于 2016-02-25T12:27:19.390 回答