我想使用 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 中寻找一些有效的解决方案。
您似乎想要聚合提供重叠时间范围的行的所有数据?或者您想对其他列中的数据做什么?
乍一看,我建议您使用用户定义的 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/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)