精华内容
下载资源
问答
  • Hive对数据去重有两种方法:(1) distinct (2) group by 本文介绍distinct、group by去重时底层的执行逻辑、数据处理原理,并介绍在不同场景下,应采用哪种方法去重

    以下面两个案例介绍distinct、group by的底层原理。
    【案例 1】去重计数案例

    select count(1) from(
    	select age
    	from student
    	group by age
    )b
    

    【案例2】简化的去重计数

    select count(distinct age)
    from student
    

    1 底层原理

    展开全文
  • hive数据清洗这里总结三种常用的去重方式 1.distinct 2.group by 3.row_number() eg: SELECT order_id, order_name, cate_type, modify_time,row_number() over(PARTITION BY order_id ORDER BY order_id DESC) ...

    在hive数据清洗这里总结三种常用的去重方式

    1.distinct

    2.group by

    3.row_number()

    eg:

    SELECT order_id, order_name, cate_type, modify_time,row_number() over(PARTITION BY order_id ORDER BY order_id DESC) num FROM order_info WHERE num= 1

    上面SQL对某一字段(order_id)排序后分区去重。


    去重的性能问题!


    当一个表的数据量非常大的时候,会发现一个简单的count(distinct order_no)这种语句跑的特别慢,和直接运行count(order_no)的时间差了很多,于是研究了一下。
    先说结论:能使用group by代替distinc就不要使用distinct,例子:

    实际论证
    order_snap为订单的快照表 总记录条数763191489,即将近8亿条记录,总大小:108.877GB,存储的是公司所有的订单信息,表的字段大概有20个,其中订单号是没有重复的,所以在统计总共有多少订单号的时候去重不去重结果都一样,我们来看看:
    统计所有的订单有多少条条数,一个count函数就可以搞定的sql性能如何。


    DISTINCT


    eg:
    select count(distinct order_no) from order_snap;

    Stage-Stage-1: Map: 396 Reduce: 1 Cumulative CPU: 7915.67 sec HDFS Read: 119072894175 HDFS Write: 10 SUCCESS
    Total MapReduce CPU Time Spent: 0 days 2 hours 11 minutes 55 seconds 670 msec
    OK
    _c0
    763191489
    Time taken: 1818.864 seconds, Fetched: 1 row(s)


    GROUP BY


    eg:
    select count(t.order_no) from (select order_no from order_snap group by order_no) t;

    Stage-Stage-1: Map: 396 Reduce: 457 Cumulative CPU: 10056.7 sec HDFS Read: 119074266583 HDFS Write: 53469 SUCCESS
    Stage-Stage-2: Map: 177 Reduce: 1 Cumulative CPU: 280.22 sec HDFS Read: 472596 HDFS Write: 10 SUCCESS
    Total MapReduce CPU Time Spent: 0 days 2 hours 52 minutes 16 seconds 920 msec
    OK
    _c0
    763191489
    Time taken: 244.192 seconds, Fetched: 1 row(s)

    结论:第二种写法的性能是第一种的7.448499541倍
    注意到为什么会有这个差异,Hadoop其实就是处理大数据的,Hive并不怕数据有多大,怕的就是数据倾斜,我们看看两者的输出信息:


    distinct


    Stage-Stage-1: Map: 396 Reduce: 1 Cumulative CPU: 7915.67 sec HDFS Read: 119072894175 HDFS Write: 10 SUCCESS


    group by


    Stage-Stage-1: Map: 396 Reduce: 457 Cumulative CPU: 10056.7 sec HDFS Read: 119074266583 HDFS Write: 53469 SUCCESS

    使用distinct会将所有的order_no都shuffle到一个reducer里面,这就是我们所说的数据倾斜,都倾斜到一个reducer这样性能能不低么?再看第二个,直接按订单号分组,起了457个reducer,将数据分布到多台机器上执行,时间当然快了.
    由于没有手动指定Reduce的个数,Hive会根据数据的大小动态的指定Reduce大小,你也可以手动指定

    hive> set mapred.reduce.tasks=100;
    类似这样,所以如果数据量特别大的情况下,尽量不要使用distinct吧。
    但是如果你想在一条语句里看总记录条数以及去重之后的记录条数,那没有办法过滤,所以你有两个选择,要么使用两个sql语句分别跑,然后union all或者就使用普通的distinct。具体来说得看具体情况,直接使用distinct可读性好,数据量如果不大的话推荐使用,如果数据太大了,性能受到影响了,再考虑优化

    展开全文
  • hive 去重

    千次阅读 2018-11-02 17:28:43
    数据: select distinct id,name,eat from test1; select max(id),max(name),max(eat) from test1; select distinct * from ...select id,name,eat from (select *,row_number() over(partition by id order by...

    数据:
    在这里插入图片描述

    select distinct id,name,eat from test1;
    在这里插入图片描述

    select max(id),max(name),max(eat) from test1;
    在这里插入图片描述

    select distinct * from test1;
    在这里插入图片描述

    select id,name,eat from (select *,row_number() over(partition by id order by name,eat) as row_id from test1) t where t.row_id = 1;
    在这里插入图片描述
    select id,name,eat from test1 group by id,name,eat;
    1 a a
    1 a b
    2 a a
    2 a b

    展开全文
  • Hive去重最佳方法

    千次阅读 2019-05-13 20:56:59
    需求 将下表中id去重,并把去重后所有字段输出 说道去重相信大部分人脑海中第一反应是: distinct 的确如此,distinct非常...SELECT id,month,label FROM t4 GROUP BY id; 结果: 但是Hive做同样的操作就会报...

    需求

    将下表中id去重,并把去重后所有字段输出
    在这里插入图片描述
    说道去重相信大部分人脑海中第一反应是:

    • distinct
      的确如此,distinct非常适合对于单个字段进行去重的操作,但是对于上面的需求貌似不好处理
      第二反应是:
    • group by
      如果是Mysql操作当然没问题:
    SELECT id,month,label FROM t4 GROUP BY id;
    

    结果:
    在这里插入图片描述
    但是Hive做同样的操作就会报错:

    FAILED: SemanticException [Error 10025]: Line 1:42 Expression not in GROUP BY key 'month','label'
    

    Hive去重最佳方法----row_number()

    select id,month,flag from (select id,month,flag,row_number() 
    over (partition by id order by month desc) as rn from view1) t where t.rn = 1;
    

    结果:

    +---+------+----+
    | id|  month|flag|
    +---+------+----+
    |133|201901|   1|
    |134|201812|   1|
    +---+------+----+
    

    结论

    Hive去重,最好使用row_number()函数

    展开全文
  • Hive去重方法

    2020-06-01 15:25:43
    方法一:使用Distinct去重 // 只取一个值 select distinct idfrom db.t_group // 取多个值,会取出ID和group_id都不同的值,如果group_id有重复的则不适用 select distinct id,group_id from db.t_group 方法二:...
  • hive去重操作

    万次阅读 2016-07-22 14:02:29
    1、建表 create table lintest(id string,name string,size int); 2、插入数据 create table inform(id string,name string,size int);...3、去重查询 select ad ,sum(plus),count(distinct name,id) from  (select di
  • 方法1,建立临时表,利用hive的collect_set 进行去重。 create table if not exists tubutest ( name1 string, name2 string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; ...
  • hive 去重数据

    千次阅读 2013-12-17 20:05:56
    select mer_id,goods_id,max(mod_time) as mod_time from hf_t_goods_inf group by mer_id,goods_id) b on (a.mer_id = b.mer_id and a.goods_id = b.goods_id and a.mod_time = b.mod_time)  where b.mer_id is ...
  • 2.group by 前面两种关系型的也常用,我就不说了。 3.row_number insert overwrite table dw_dw.dw_dim_address select row_number() over() as pk_address_code , t2.province_name ,t2.city_...
  • 相关文章推荐:hive使用技巧(一)自动化动态分配表分区及修改hive表字段名称hive使用技巧(二)——共享中间结果集hive使用技巧(三)——巧用group by实现去重统计hive使用技巧(四)——巧用MapJoin解决数据倾斜...
  • 实验目的:本文主要测试在某字段各种不同值个数情况下,记录对此字段其使用DISTINCT/GROUP BY去重的查询语句执行时间,对比两者在不同场景下的去重性能 实验表格: 表名 记录数 查询字段不同值个数 DISTINCT ...
  • hive 数据去重

    千次阅读 2018-07-26 21:27:25
    1、hive 0.8.0数据表去重方法 问题描述:hive的外部表test中,在若干字段上存在重复现象,现在需要将若干字段上值相同的多条记录,只保其中留一条,  舍弃其余的。   解决思路:  (1)group by的方法    首先...
  • 源数据(mysql) id userid subject score 1 001 语文 90.0 2 001 数学 92.0 3 001 英语 80.0 4 002 语文 88.0 5 002 数学 90.0 6 002 英语 75.5 7 003 语文 70.0 ...源数据(hive) C1 C2 C3 C4.
  • 查询出当前表中,电话号码出现数...having count and group by select mobile,count(1)cnt from rbc_audience_users group by mobile having count(mobile) >1 查询出rbc_audience_users表中 mobile大于一条...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,130
精华内容 2,052
关键字:

groupbyhive去重