IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive--count(distinct)优化 -> 正文阅读

[大数据]Hive--count(distinct)优化

前言

  • COUNT(DISTINCT xxx)在hive中很容易造成数据倾斜。
  • 第一印象是用size(collect_set(字段))替代COUNT(DISTINCT 字段)
    • 但是如果当数据量大到一定的数量,会导致处理倾斜的reduce任务产生内存溢出的异常
    • collect_set输出一个数组,中间结果会放到内存中,所以如果collect_set聚合太多数据,会导致内存溢出。

实例

  • uuid是一个很长的字符串,假定其长度为64位。
  • 需求:统计用户数
SELECT
  COUNT(DISTINCT uuid)
FROM test t
  • 由于引入了DISTINCT,因此在Map阶段无法利用combine对输出结果消重,必须将uuid作为key输出,在Reduce阶段再对来自于不同Map Task、相同Key的结果进行消重,计入最终统计值。
  • 即使调整set mapred.reduce.tasks=100参数也不会实际影响Reduce Task个数,Hive运行时输出“Number of reduce tasks determined at compile time: 1”。原来Hive在处理COUNT这种“全聚合(full aggregates)”计算时,它会忽略用户指定的Reduce Task数,而强制使用1

优化一

-- 外层SELECT求和
SELECT
  SUM(mau_part) mau
FROM
(
  -- 内层SELECT分别进行COUNT(DISTINCT)计算
  SELECT
    substr(uuid, 1, 3) uuid_part,
    COUNT(DISTINCT substr(uuid, 4)) AS mau_part
  FROM test
  GROUP BY substr(uuid, 1, 3)
) t;
  • 解析
    • 内层SELECT根据uuid的前3位进行GROUP BY,多个reduce处理,减少每个reduce的数据量,充分利用mr的分而治之思想,外层SELECT求和,得到最终结果。
    • 关于截取值n的取值,我们假定uuid是由字母和数字组成的:大写字母、小写字母和数字,字符总数为26+26+10=62。理论上,内层SELECT进行GROUP BY时,会有 62^n 个分组,外层SELECT就会进行 62^n 次求和。所以n的取值需要适当。

优化二


--  第三层SELECT
SELECT
  SUM(s.mau_part) mau
FROM
(
  -- 第二层SELECT
  SELECT
    tag,
    COUNT(*) mau_part
  FROM
  (
      -- 第一层SELECT
    SELECT
      uuid, 
      CAST(RAND() * 100 AS INT) tag  -- 为去重后的uuid打上标记,标记为:0-100之间的整数。
    FROM test
    GROUP BY uuid   -- 通过GROUP BY,保证去重
   ) t
  GROUP BY tag
) s

  • 第一层SELECT:对uuid进行去重,并为去重后的uuid打上整数标记
  • 第二层SELECT:按照标记进行分组,统计每个分组下uuid的个数
  • 第三层SELECT:对所有分组进行求和
  • 上面这个方法最关键的是为每个uuid进行标记,这样就可以对其进行分组,分别计数,最后去和。如果数据量确实很大,也可以增加分组的个数。例如:CAST(RAND() * 1000 AS BIGINT) tag
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:56:57  更:2021-10-01 16:57:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:35:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码