如果有人问, select * from ...
(这可能是ctas声明的一部分)
我们的目标是增加一列, ID
,在哪里 ID
是唯一整数。
select ... as ID,* from ...
附笔 ID
不必是连续的(可能有间隙)
id可以是任意的(不必表示结果集中的特定顺序)
行号从逻辑上解决了这个问题-
select row_number() over () as ID,* from ...
问题是,至少目前,全局行数(没有分区依据)是使用单个缩减器(hive)/任务(spark)实现的。
4条答案
按热度按时间oaxa6hgo1#
检查一下这个全局唯一的id服务https://github.com/spinaki/distributed-unique-id 它也有一个码头形象,你可以快速测试。
flmtquvp2#
如果您使用的是sparksql,那么最好使用内置函数
单调递增的
在单独的列中生成唯一的随机id。正如你所说,你不需要它是连续的,所以这应该满足你的理想要求。
34gzjxbg3#
检查manoj kumar的溶液:https://github.com/manojkumarvohra/hive-hilo
创建一个有状态的udf,它维护一个hi/lo计数器来递增序列。
在zookeeper中,hi值保持为distribute atomic long。
hi值每n lo(默认200)次迭代递增并获取一次。
udf支持单个字符串参数,该参数是用于在zookeeper中维护znodes的序列名称。
用法:
gzszwxb44#
Hive
select 1 + x + (row_number() over (partition by x) - 1) * ${hivevar:buckets} as id
,t.*
from (select t.*
,abs(hash(rand())) % ${hivevar:buckets} as x
select 1 + x + (row_number() over (partition by x) - 1) * 10000 as id
,t.*
from (select t.*
,abs(hash(rand())) % 10000 as x
select 1 + (abs(hash(col1,col)) % 10000)
+ (row_number() over (partition by abs(hash(col1,col)) % 10000) - 1) * 10000 as id
,t.*
from t