Hive UDF UDFRowSequence生成前两条记录值相同问题求助
我之前也踩过UDFRowSequence的坑!咱们先唠唠为啥会出现前两条ID相同的情况:
UDFRowSequence是在每个Map任务里单独维护一个计数器,每条进入该Map的数据都会让计数器自增1。如果前两条数据被分配到了同一个Map任务,那它们的初始计数器都是1,自然就会生成相同的rank_id了。
给你两个靠谱的解决办法:
方法一:用窗口函数row_number()替代(强烈推荐)
这是最稳妥的方案,窗口函数能全局生成唯一的自增ID,完全避免重复问题。针对你的数据,你可以这样写SQL:
SELECT row_number() OVER (ORDER BY datetime) AS rank_id, state, id, datetime FROM your_table_name;
这里通过ORDER BY datetime让数据按时间排序,row_number()会基于这个排序结果生成连续不重复的自增ID,完美解决你的问题。
方法二:如果坚持用UDFRowSequence(不推荐)
要是你非得用这个UDF,那得先把数据分散到不同的Map任务里,或者先做全局排序。比如先按某个唯一字段分区,再使用UDFRowSequence,但操作起来比窗口函数麻烦很多,而且依然不能100%保证全局唯一,所以还是更推荐第一种方法。
用方法一跑你的示例数据,得到的结果应该是:
+-------+----------+---+-------------------+
|rank_id| state| id| datetime|
+-------+----------+---+-------------------+
| 1|New Jersey| 10|2018-03-27 10:00:00|
| 2| Tamil| 25|2018-03-27 11:05:00|
| 3| TamilNa| 25|2018-03-27 11:15:00|
| 4| TamilNadu| 25|2018-03-27 11:25:00|
| 5| Gujarat| 30|2018-03-27 11:00:00|
+-------+----------+---+-------------------+
这样rank_id就完全连续不重复啦!
内容的提问来源于stack exchange,提问作者Arjun

