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

Azure Data Lake Analytics: Combine overlapping time duration using U-SQL

我想使用 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 User defined operators for Azure Data Lake Analytics 作业并从 U-SQL.

中寻找一些有效的解决方案

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

乍一看,我建议您使用用户定义的 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();

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

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