当前位置: 首页 > article >正文

hive里如何高效生成唯一ID

常见的方式:

 hive里最常用的方式生成唯一id,就是直接使用 row_number() 来进行,这个对于小数据量是ok的,但是当数据量大的时候会导致,数据倾斜,因为最后生成全局唯一id的时候,这个任务是放在一个reduce里进行的,数据量过大会有很大的瓶颈。

优化的方式:

主体的思想就是先分再合,参考下一个思路:

这个思路是借鉴了一篇文章的思路:附上链接:bitmap用户分群方法在贝壳DMP的实践和应用_架构_侯学博_InfoQ精选文章

我是只想用sql来做具体的实现,如何实现最好呢?

1:将数据打散,分为N份

2:在这N份里,先分别给一个行号使用row_number()

3: 统计出来每份里有多少条数据(这个数据要在第四步里使用)

4: 计算出来到当前分片最大的行号是多少(这个就是我如下图示里的,上一个分片的最大行号+下当前分片数据的条数)sum() over() 来实现的

with temp01 as (
    select
        iccid,
        imsi,
        cast(rand() * 200 as bigint) num
    from
        原始表
    where
        date_id = '20231123';

)
select
    a.iccid,
    a.imsi,
    a.num as a_num,
    a.rn,
    b.num as b_num,
    b.cnt,
    b.amt,
    nvl(b.amt, 0) + rn as final_num
from
    (
        select
            iccid,
            imsi,
            num,
            ROW_NUMBER() OVER(PARTITION BY num) AS rn
        from
            temp01
    ) a
    left outer JOIN (
        select
            num,
            cnt,
// 这个sum就是生成到当前分区最大的行号是多少,这里一定要理解sum() over这个窗口函数是怎么个原理。再强调一次:是到当前分区累加起来的行号。
            sum(cnt) over(
                order by
                    num
            ) amt
        from
            (
                select
                    num,
                    count(*) cnt
                from
                    temp01
                group by
                    num
            ) a
    ) b on a.num -1 = b.num;

配上完整的sql实现逻辑:


http://www.kler.cn/news/161094.html

相关文章:

  • 私域最全养号攻略---微信
  • springboot(ssm甘肃旅游工艺品商城 旅游管理系统Java(codeLW)
  • uniapp app将base64保存到相册,uniapp app将文件流保存到相册
  • Scrapy框架中间件(一篇文章齐全)
  • layui学习笔记
  • K8S pod无损上下线
  • Spark例子
  • C# Onnx 百度飞桨开源PP-YOLOE-Plus目标检测
  • oracle通配符大全
  • 美妆行业创业新思路:消费增值模式助力线上业务拓展
  • XXL-Job详解(一):组件架构
  • 马来西亚虾皮选品工具:如何优化您的电商业务
  • Vue.component
  • <习题集><LeetCode><链表><2/19/21/23/24>
  • 每日一练2023.12.7—— 情人节【PTA】
  • 某60区块链安全之薅羊毛攻击实战一学习记录
  • 【C语言】程序设计加密解密
  • mac M系列芯片安装chatGLM3-6b模型
  • js vue 输入正确手机号/邮箱后,激活“发送验证码”按钮
  • 详解线段树
  • C语言——指针的运算
  • LLM(五)| Gemini:谷歌发布碾压GPT-4最强原生多模态,语言理解能力首次超过人类
  • Java API接口强势对接:构建高效稳定的系统集成方案
  • java-HashMap、TreeMap、LinkedHashMap、ArrayList、LinkedList使用笔记
  • 什么是https 加密协议?https证书安装部署
  • 微信小程序复制功能
  • 如何通过内网穿透实现无公网IP也能远程访问内网的宝塔面板
  • C# WPF上位机开发(抽奖软件)
  • 【云原生系列】Kubernetes知识点
  • Python-字典详解