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

巧用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来说难免又造成数据倾斜。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识MASA Blazor

MASA Blazor是一个Blazor的UI组件库。就像大家写前端熟知的Bootstrap, Ant Design一样。MASA Blazor官网地址:https://blazor.masastack.comMASA Blazor Github地址:https://github.com/BlazorComponent/MASA.BlazorMASA Blazor Pro演示地址:…

Thread.sleep还是TimeUnit.SECONDS.sleep

刚看到TimeUnit.SECONDS.sleep()方法时觉得挺奇怪的,这里怎么也提供sleep方法?public void sleep(long timeout) throws InterruptedException {if (timeout > 0) {long ms toMillis(timeout);int ns excessNanos(timeout, ms);Thread.sleep(ms, ns…

win7技巧

win7鼠标右键菜单清理 win7右键菜单设置 |浏览:7659|更新:2014-03-04 14:23|标签: windows7 鼠标 1234567分步阅读虽然我们现在打开某个软件都是双击解决完事,但是偶尔我们需要右键属性的时候,可以看到右键菜单拖拖拉拉…

shell基础一

Shell支持自定义变量。 定义变量 定义变量时,变量名不加美元符号($),如: variableName"value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。 同时&…

python画方波_python实现周期方波信号频谱图

在学习傅里叶变换的时候遇到了求周期方波信号频谱图的例子,在书上和网上查阅了一些资料,发现大都是讨论的都是下图左边的周期信号的频谱,课程老师的PPT中也只列出了另一种周期信号频谱图的结论,没有在进行傅里叶变换,自…

基于Python的电商平台淘宝商品评论数据采集与分析

引言 在电商竞争日益激烈的情况下,商家既要提高产品质量,又要洞悉客户的想法和需求,关注客户购买商品后的评论,而第三方API接口商家获取商品评价主要依赖于人工收集,不但效率低,而且准确度得不到保障。通过…

《Pyflink》Flink集群安装,Python+Flink调研

Flink集群安装,PythonFlink调研 Flink集群部署 下载对应版本安装包:https://flink.apache.org/downloads.html 实验环境为hadoop2.7, scala2.11 所以下载flink-1.7.1-bin-hadoop27-scala_2.11.tgz 配置conf/flink-conf.yaml jobmanager.rpc…

项目手札2---关于分页显示时地址栏的风格

在控制器里&#xff0c;用RequestMapping("")时我们可能用RESTFUL风格的来映射&#xff0c;也有可能是用其他的方式&#xff0c;用或不用RESTFUL风格在分页显示时的地址栏里有些不同。首先来看不用RESTFUL时地址栏的样子&#xff1a; <li><a href"show…

shell基础二

前面已经讲到&#xff0c;变量名只能包含数字、字母和下划线&#xff0c;因为某些包含其他字符的变量有特殊含义&#xff0c;这样的变量被称为特殊变量。例如&#xff0c;$ 表示当前Shell进程的ID&#xff0c;即pid&#xff0c;看下面的代码&#xff1a; $echo $$ 运行结果 29…

hdu 4539(状压dp)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4539 思路&#xff1a;跟poj1185简直就是如出一辙&#xff01; 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 using namespace std;6 7 int row…

万字长文入门 Redis 命令、事务、锁、订阅、性能测试

Redis 基本数据类型Redis 中&#xff0c;常用的数据类型有以下几种&#xff1a;String&#xff1a;字符串类型&#xff0c;二进制安全字符串&#xff1b;Hash&#xff1a;哈希表&#xff1b;List 列表&#xff1a;链表结构&#xff0c;按照插入顺序排序的字符串元素的集合&…

postgresql 查看page, index, tuple 详细信息

下面的内容需要理解postgres术语 page, tuple, regclass, relname. sql command 需要用到 pgstattuple,pageinspect extension.Setup Extension create extension pgstatuplecreate extension pageinspect 查询page, index 详细信息 show how many pages in one tableselect pg…

python读写文件错误_Python读取csv文件错误解决方法

如果累了就拥抱我取暖 ——侃爷 今天这篇推文很简单&#xff0c;就是给大家总结一下我今天用pandas读取csv文件遇到的坑。 一直处理csv文件都是用pandas的read_csv函数读取csv文件之后处理&#xff0c;都没碰到过什么问题。But&#xff0c;But今天帮朋友处理csv文件时&#xff…

基于应用日志的扫描器检测实践

基于应用日志的扫描器检测实践 在网络上搜索web扫描器时&#xff0c;各类扫描器工具、扫描攻略玲琅满目&#xff0c;但对扫描器检测方法的内容却少之又少。因此&#xff0c;本文对各类web扫描特特征进行了梳理和总结&#xff0c;并结合苏宁应用防火墙&#xff08;SNWAF&#x…

shell基础三

如果表达式中包含特殊字符&#xff0c;Shell 将会进行替换。例如&#xff0c;在双引号中使用变量就是一种替换&#xff0c;转义字符也是一种替换。举个例子&#xff1a; #!/bin/basha10echo -e "Value of a is $a \n" 运行结果&#xff1a; Value of a is 10 这里 …

将一个压缩文件分成多个压缩文件;RAR文件分卷

有时候需要上传压缩文件&#xff0c;但是限制了单个文件的大小&#xff0c;那我们怎么才能将一个比较大的压缩文件分割成多个压缩文件&#xff0c;从而符合要求的进行文件的上传呢&#xff1f;这里小编告诉你一个技巧。 工具/原料 电脑 winrar&#xff08;一般电脑都自带了&…

定义命令别名(alias)

Linux之alias:1.查看当前别名&#xff1a;alias# alias alias cpcp -i alias l.ls -d .* --colortty alias llls -l --colortty alias lsls --colortty alias mvmv -i alias rmrm -i alias whichalias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde 2.设…