Hive sql去重

1、数据背景:首先,公司,2019年4月15日有335150条订单,各条订单中都有唯一的标识ID(order_id)对应一笔交易。

  根据交易流程,在系统上报该交易信息时依次会有已下单、已支付、已发货、配送中、已接收、已退货、已退款等多种事务状态,而且每个事务的发生都会在Hive表中生成一条记录。因此,当天实际交易量(唯一order_id)可能只有70000单左右。

2、作业参数:在执行Hive sql作业前,需要评估原始数据量,然后配置Hive中mapper和reducer的执行参数。

set mapred.max.split.size=256000;  //每个mapper处理的最大的文件大小,单位为B
set mapred.min.split.size.per.node=256000;  //节点中可以处理的最小的文件大小,单位为B
set mapred.min.split.size.per.rack=256000;  //机架中可以处理的最小的文件大小,单位为B
set hive.exec.reducers.max=100;  //每个任务中最大的reduce数
set hive.exec.reducers.bytes.per.reducer=102400000;  //每个reducer处理的数据量,单位B

3、解决方案:

(1)distinct:distinct需要通过大量数据(如果数据集确实很大的话)之间的shuffle比较(混洗)筛选出所有唯一标识的结果集。

select distinct order_id
from db.order
where dt=‘20190405‘
  • 执行日志:

MapReduce Jobs Launched: Stage-Stage-1: Map: 97  Reduce: 1   Cumulative CPU: 383.02 sec   HDFS Read: 24407412 HDFS Write: 789899

SUCCESS

Total MapReduce CPU Time Spent: 6 minutes 23 seconds 20 msec

OK

Time taken: 93.535 seconds, Fetched: 71809 row(s)

  • 逻辑分析:该Hive sql作业时启动97个mapper拉取了数据库中335150条记录,然后通过1个reducer fetch所有的记录做对比去重,耗时93.535秒。

(2)group by:该方法是通过分组方式获取唯一的组,应用在去重场景下需要将标识字段(order_id)作为分组的 key,即 group by order_id。

select order_id
from db.order
where dt=‘20190405‘
group by order_id;
  • 执行日志:

MapReduce Jobs Launched: Stage-Stage-1: Map: 97  Reduce: 1   Cumulative CPU: 400.63 sec   HDFS Read: 24410031 HDFS Write: 789899

SUCCESS

Total MapReduce CPU Time Spent: 6 minutes 40 seconds 630 msec

OK

Time taken: 85.937 seconds, Fetched: 71809 row(s)

  • 逻辑分析:该Hive sql作业时启动97个mapper拉取了数据库中335150条记录,然后通过1个reducer fetch所有的记录做对比去重,耗时93.535秒。

(3)row number() over():

select order_id
from
(
    select          order_id,
         row_number over(patition by order_id )  as num
    from db.order
    where dt=‘20180415‘;
) order

where num=1;
  • 执行日志:

MapReduce Jobs Launched: Stage-Stage-1: Map: 97  Reduce: 1   Cumulative CPU: 458.32 sec   HDFS Read: 24298434 HDFS Write: 789899

SUCCESS

Total MapReduce CPU Time Spent: 7 minutes 38 seconds 320 msec

OK

Time taken: 100.866 seconds, Fetched: 71809 row(s)

  • 逻辑分析:该Hive sql作业时同样启动97个mapper拉取了数据库中335150条记录,然后通过1个reducer fetch所有的记录并对相同分组下的记录做编号,然后取出num=1的记录,共耗时100.866秒。

1.当数据量较小时,优先考虑使用distinct,可读性强,简洁高效;

2.当数据量较大时,推荐使用group by,性能可靠,结合mapper和reducer参数设置后性能优化更佳;

3.row_number() over()窗口函数本身是为分组内排序设计的,通过num=1限制后也可以用作数据去重。

原文地址:https://www.cnblogs.com/guoyu1/p/12304490.html

时间: 2024-10-28 12:25:22

Hive sql去重的相关文章

Hive SQL的编译过程

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和性能对我们的数据分析非常关键. 在几次升级Hive的过程中,我们遇到了一些大大小小的问题.通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解.对这一过程的理解不仅帮助我们解决了一些Hive的bug,也有利于我们优化Hive SQL

Hive SQL 编译过程

转自:http://www.open-open.com/lib/view/open1400644430159.html Hive跟Impala貌似都是公司或者研究所常用的系统,前者更稳定点,实现方式是MapReduce,因为用Hue的时候,在groupby中文的时候,出现了点问题,并且看到写很长的SQL语句,经常会看到起很多个Job,因此想了解下Hive怎么将SQL转化成MapReduce的Job.以后写SQL的时候,大概就了解怎么去做优化了.下面是看到的一片优秀的文章(美团的技术博客),我粘过

(转)Hive SQL的编译过程

本文来着美团 :http://tech.meituan.com/hive-sql-to-mapreduce.html Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和性能对我们的数据分析非常关键. 在几次升级Hive的过程中,我们遇到了一些大大小小的问题.通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapRedu

由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考

背景 我们使用的HiveServer2的版本为0.13.1-cdh5.3.2,目前的任务使用Hive SQL构建,分为两种类型:手动任务(临时分析需求).调度任务(常规分析需求),两者均通过我们的Web系统进行提交.以前两种类型的任务都被提交至Yarn中一个名称为“hive”的队列,为了避免两种类型的任务之间相互受影响以及并行任务数过多导致“hive”队列资源紧张,我们在调度系统中构建了一个任务缓冲区队列,所有被提交的任务(手动任务.调度任务)并不会直接被提交至集群,而是提交至这个缓冲区队列中,

Hadoop Hive sql 语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持

Hadoop Hive sql语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持

Sql去重语句

海量数据(百万以上),其中有些全部字段都相同,有些部分字段相同,怎样高效去除重复? 如果要删除手机(mobilePhone),电话(officePhone),邮件(email)同时都相同的数据,以前一直使用这条语句进行去重: 1 delete from 表 where id not in 2 (select max(id) from 表 group by mobilePhone,officePhone,email ) 3 or 4 delete from 表 where id not in 5

SQL 去重

delete from testtable a where (a.testcontent) in (select testcontent from testtable GROUP BY testcontent having count(*)>1) and seqid not in (select min(seqid) from testtable group by testcontent having count(*)>1) SQL 去重,布布扣,bubuko.com

【甘道夫】使用HIVE SQL实现推荐系统数据补全

需求 在推荐系统场景中,如果基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果很可能达不到要求的数量. 比如,希望针对每个item或user推荐20个item,但是通过计算只得到8个,剩下的12个就需要补全. 欢迎转载,请注明出处: http://blog.csdn.net/u010967382/article/details/39674047 策略 数据补全的具体策略是: 补全时机:在挖掘计算结束后,挖掘结果导入HBase(最终web系统从HBase取数据)前,进行数据补全,补全后