巧用Hive自带函数进行多字段分别去重计数统计

1-group by 和 distinct

大前提:大表统计能使用group by就不要使用distinct!!

尤其是在数据量非常大的时候,distinct会将所有的统计信息加载到一个reducer里取执行,这就是所谓的数据倾斜。而group by会把相同key的记录放到一个reducer区计算,因此效率会提高很多。

业务需要对一个分区内一百亿记录进行多个字段的去重统计。本着以上原则写出了以下代码:

SET hive.map.aggr=TRUE;
SET hive.optimize.skewjoin = TRUE;
SET hive.groupby.skewindata=TRUE;
SET mapreduce.input.fileinputformat.split.minsize=256000000;
SET mapreduce.input.fileinputformat.split.maxsize=512000000;
SET mapreduce.input.fileinputformat.split.minsize.per.node=512000000;
SET mapreduce.input.fileinputformat.split.minsize.per.rack=512000000;
SET hive.hadoop.supports.splittable.combineinputformat=TRUE;
--Group by及文件压缩优化CREATE TABLE IF NOT EXISTS statis (date string, accessn STRING, accessnum BIGINT, intercept STRING, interceptnum BIGINT, customn string, customnum BIGINT, ipn STRING, ipnum BIGINT, hostn STRING, hostnum BIGINT, uan STRING, uanum BIGINT);INSERT INTO TABLE statis
SELECT *
FROM(SELECT date,"访问:",COUNT(1)FROM log1WHERE ldc = 'XXXX') ACCESS
JOIN(SELECT "拦截:",COUNT(1)FROM log2) intercept ON (1=1)
JOIN(SELECT "IP量:",count(1)FROM(SELECT 1FROM log1WHERE ldc='XXXX'GROUP BY split(xff,",")[0]) ip) ips ON (1=1)
JOIN(SELECT "域名:",count(1)FROM(SELECT 1FROM log1WHERE ldc='XXXX'GROUP BY host) host) hosts ON (1=1)
JOIN(SELECT "UA量:",count(1)FROM(SELECT 1FROM log1WHERE ldc='XXXX'GROUP BY ua) ua) uas ON (1=1);

然后放到集群取执行,结果跑了两个小时 ,容我静静。。。

其实已经考虑到存在因数据不均匀造成的数据倾斜问题,因此提前做了Group by 优化,但数据量确实不小耗时太久。这是突然想起一种奇技淫巧。。。

2-巧用collect_set进行去重统计

Hive中函数collect_set()的作用是将多个查询结果去重后形成一个数组,一般与group by进行结合使用。

这里我突然想到使用size()函数和collect_set()相结合,达到多个字段去重后统计的效果。原理是将去重后的结果放到一个reducer里进行统计计数,这样避免了多次的group by和join操作,进而大大提升执行效率。代码如下:

INSERT INTO TABLE statis
SELECT *
FROM(SELECT date,"访问:",COUNT(1)FROM log1WHERE ldc = 'XXXX') ACCESS
JOIN(SELECT "拦截:",COUNT(1)FROM log2) intercept ON (1=1)
JOIN(SELECT "用户:",size(collect_set(member)),"IP量:",size(collect_set(split(xff,',')[0])),"域名:",size(collect_set(host)) ,"UA量",size(collect_set(ua))FROM log1WHERE  ldc='XXXX') couns ON (1=1);

小提示:使用该方法的前提是去重后的结果不能过多,否则对一个reducer来说难免又造成数据倾斜。

巧用Hive自带函数进行多字段分别去重计数统计相关推荐

  1. hive分区用2个字段有何限制_关于Hive使用动态分区插入数据详解

    1.创建一个单一字段分区表 hive>  create table dpartition(id int ,name string ) partitioned by(ct string  ); 2 ...

  2. es统计有多少个分组_es多字段分组去重统计

    < es多字段分组去重统计 oracle中sql: select a1 ,b1 from dual group by a1 ,b1 或 select DISTINCT a1 ,b1 from d ...

  3. jquery数组去重:纯数字数组去重,forEach判断数组是否含有该字段,单个数组通过某个字段名去重value值,多个数组合并同时根据某个字段进行去重

    纯数字数组去重 const numbers = [1, 1, 20, 3, 3, 3, 9, 9]; const uniqueNumbers = [...new Set(numbers)] //输出u ...

  4. hive分区用2个字段有何限制_[Hive]新增字段(column)后,旧分区无法更新数据问题...

    问题描述: 实际应用中,常常存在修改数据表结构的需求,比如:增加一个新字段. 如果使用如下语句新增列,可以成功添加列col1.但如果数据表tb已经有旧的分区(例如:dt=20190101),则该旧分区 ...

  5. hive分区用2个字段有何限制_Hive分区表和桶表的使用

    我们看官网文档中这个地方 我们先创建好数据库,以供练习 使用数据库 我们创建数据表 我们创建分区表,选取的字段不能是表中存在的字段 元数据信息 Formatted信息 那我们加载信息 load dat ...

  6. hive分区用2个字段有何限制_[特性]Hive动态分区功能使用

    [特性]Hive动态分区功能使用 2016-01-31 21:40 说明 Hive有两种分区,一种是静态分区,也就是普通的分区.另一种是动态分区.动态分区在数据导入时,会根据具体的字段值自行决定导入, ...

  7. Hive 1.1.0 某些字段的查询结果为NULL

    现象查询fct_traffic_navpage_path_detl的2015-01-19 分区显示结果如下: Hive 1.1.0 返回结果如下,可见最后一个字段为NULL 87FQEZT1UEDXJ ...

  8. Hive 取非 Group by 字段数据的方法

    遇到这么一个需求,输入数据为一个ID对应多个name,要求输出数据为ID是唯一的,name随便取一个就可以. 执行以下Hive ql语句: 1 2 3 4 5 6 SELECT   sid,   cl ...

  9. hive 非正确json格式字段造成查询错误

    1. 问题 hive查询报错: Diagnostic Messages for this Task: [2020-04-02 05:32:04,360] {bash_operator.py:110} ...

最新文章

  1. Jeff Dean:一年开源12款新工具,谷歌负责任AI原则落地生根
  2. 混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布
  3. Android Studio2.3.3 提示找不到 jni.h
  4. C语言程序设计 练习1-13
  5. 20190829:(leetcode习题)环形链表
  6. Appium原理初步--Android自动化测试学习历程
  7. Python与R语言优缺点比较——“术业有专攻”
  8. JAVA程序员笔试面试题汇总及答案 .
  9. qcow2 磁盘镜像文件的创建、格式化、分区、挂载
  10. 批量微信过滤开通助手 急速微信筛选开通助手
  11. Unity shader 角色消失 溶解 隐身 效果
  12. Bayes,HMM,MRF Gibbs Distribution在图像降噪中的应用
  13. base64图片 复制到系统剪切板
  14. 二分——切绳子(C++)
  15. Linux ubuntu 基本美化 还有常用应用安装
  16. 百度外卖 php,百度外卖移动组件架构与优化
  17. beanstalk队列服务for php
  18. 近期关于项目团队和小公司产品策略的一些想法
  19. Android进阶之路 - 使用Stetho查看真机数据库
  20. 黑鸟每日安全资源推送​第24期(求关注转发,良心推送)

热门文章

  1. 面向对象程序设计__Task3_Calculator
  2. 电商项目(一)---------Sku和Spu以及电商项目商品的设计思路
  3. python 数据保存为npy和npz格式并读取
  4. moviepy音视频剪辑:使用VideoFileClip、AudioFileClip和write_videofile、write_audiofile进行音视频的加载和输出
  5. linux蓝牙小车,蓝牙控制遥控车制作教程
  6. 书写SQL必养成的好习惯
  7. Broker存储机制详解
  8. 专家系统是一种智能计算机软件系统,人工智能课件8之专家系统[最新].ppt
  9. OpenSUSE 初始化设置
  10. python爬虫豆瓣评论论文_python 爬虫 豆瓣 评论及评分