Azure 数据湖分析:使用 U-SQL 合并重叠的持续时间
本文关键字:合并 重叠 持续时间 U-SQL 使用 数据湖 Azure | 更新日期: 2023-09-27 18:36:05
我想使用 U-SQL 从放置在 Azure 数据湖存储中的 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 数据湖分析作业的 U-SQL 用户定义的运算符,并从 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();
请注意,仅当您的范围在同一天并且不超过午夜时,此操作才有效。
使用为用户处理不相交范围的解决方案进行了更新您可以使用用户定义的化简器来解决它。以下博客文章介绍了解决方案的详细信息,并提供了指向 GitHub 代码的链接:https://blogs.msdn.microsoft.com/mrys/2016/06/08/how-do-i-combine-overlapping-ranges-using-u-sql-introducing-u-sql-reducer-udos/