`
superlxw1234
  • 浏览: 550716 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:44350
社区版块
存档分类
最新评论

hive 多字段同时count(distinct)优化

 
阅读更多

1.    需求与现状:
源表:pcup_3month_login_dtl_mes , 记录数12亿,文件数 300
统计SQL:

insert overwrite table pcup_logininfo_tmp partition(data_type = 1)
  select popt_id,
         null as sndaid,
         count(distinct case when login_date>='2012-02-01' and login_date<'2012-05-01' then login_date else null end) as m3_login,
         null as m3_login_top5,
         count(distinct case when login_date>='2012-05-01' and login_date<='2012-05-09' then login_date else null end) as mn_login,
         null as mn_login_top5,
         null as m3_apptype,
         null as mn_apptype,
         count(distinct case when login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='1' then login_date else null end) as m3_g_login,
         null as m3_g_login_top5,
         count(distinct case when login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='2' then login_date else null end) as m3_l_login,
         null as m3_l_login_top5,
         count(distinct case when login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='3' then login_date else null end) as m3_s_login,
         null as m3_s_login_top5,
         count(distinct case when login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='4' then login_date else null end) as m3_o_login,
         null as m3_o_login_top5,
         count(distinct case when login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='1' then login_date else null end) as mn_g_login,
         null as mn_g_login_top5,
         count(distinct case when login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='2' then login_date else null end) as mn_l_login,
         null as mn_l_login_top5,
         count(distinct case when login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='3' then login_date else null end) as mn_s_login,
         null as mn_s_login_top5,
         count(distinct case when login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='4' then login_date else null end) as mn_o_login,
         null as mn_o_login_top5
  from pcup_3month_login_dtl_mes
  group by popt_id;

 特点:group by 维度少,多字段count(distinct), reduce task非常少(7个)
耗时:1个半小时以上

 

2.    优化思路:

利用union all + group by + rownumber 代替所有的count(distinct);
根据文件大小设置合理的reduce task数量;

 

3.    优化后的代码:耗时20分钟左右

SET mapred.reduce.tasks = 100;

 

//初步过滤+去重

create table lxw_test3 as 
select popt_id,login_date,apptypeid 
from pcup_3month_login_dtl_mes 
where login_date>='2012-02-01' and login_date <= '2012-05-09' 
group by popt_id,login_date,apptypeid;

 

//利用rownumber 函数做去重标记

 

add jar hdfs://nn.dc.sh-wgq.sdo.com:8020/group/p_sdo_data/udf/snda_udf.jar;
CREATE TEMPORARY FUNCTION row_number AS 'com.snda.hive.udf.UDFrow_number';

                   create table lxw_test4 as 
select type,popt_id,login_date,row_number(type,login_date,popt_id) as rn 
from (
       select type,popt_id,login_date 
       from (
                select 'm3_login' as type,popt_id,login_date  
                from lxw_test3 
                where login_date>='2012-02-01' and login_date<'2012-05-01' 
                union all 
                select 'mn_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-05-01' and login_date<='2012-05-09' 
                union all 
                select 'm3_g_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='1' 
                union all 
                select 'm3_l_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='2' 
                union all 
                select 'm3_s_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='3' 
                union all 
                select 'm3_o_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-02-01' and login_date<'2012-05-01' and apptypeid='4' 
                union all 
                select 'mn_g_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='1' 
                union all 
                select 'mn_l_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='2' 
                union all 
                select 'mn_s_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='3' 
                union all 
                select 'mn_o_login' as type,popt_id,login_date 
                from lxw_test3 
                where login_date>='2012-05-01' and login_date<='2012-05-09' and apptypeid='4' 
       ) x 
       distribute by type,login_date,popt_id sort by type,login_date,popt_id 
) y;
 

 

//用普通的聚合函数进行汇总

 

insert overwrite table pcup_logininfo_tmp partition(data_type = 99) 
select popt_id,
null as sndaid,
sum(case when type = 'm3_login' and rn = 1 then 1 else 0 end) as m3_login,
null as m3_login_top5,
sum(case when type = 'mn_login' and rn = 1 then 1 else 0 end) as mn_login,
null as mn_login_top5,
null as m3_apptype,
null as mn_apptype,
sum(case when type = 'm3_g_login' and rn = 1 then 1 else 0 end) as m3_g_login,
null as m3_g_login_top5,
sum(case when type = 'm3_l_login' and rn = 1 then 1 else 0 end) as m3_l_login,
null as m3_l_login_top5,
sum(case when type = 'm3_s_login' and rn = 1 then 1 else 0 end) as m3_s_login,
null as m3_s_login_top5,
sum(case when type = 'm3_o_login' and rn = 1 then 1 else 0 end) as m3_o_login,
null as m3_o_login_top5,
sum(case when type = 'mn_g_login' and rn = 1 then 1 else 0 end) as mn_g_login,
null as mn_g_login_top5,
sum(case when type = 'mn_l_login' and rn = 1 then 1 else 0 end) as mn_l_login,
null as mn_l_login_top5,
sum(case when type = 'mn_s_login' and rn = 1 then 1 else 0 end) as mn_s_login,
null as mn_s_login_top5,
sum(case when type = 'mn_o_login' and rn = 1 then 1 else 0 end) as mn_o_login,
null as mn_o_login_top5
from lxw_test4 
group by popt_id
 

 

 

 

 

分享到:
评论

相关推荐

    Hive优化.docx

    针对Hive的性能优化,可以从多个角度入手,特别是在处理复杂的Join操作时。以下是根据标题、描述以及部分内容提炼出的关键知识点: 1. **Join操作优化**: - **Join顺序调整**:在Join操作中,应将较小的表或子...

    hive优化建议.docx

    总之,Hive的性能优化涉及到多个层面,包括数据处理策略、MapReduce参数调优以及JOIN操作的设计。通过上述方法,我们可以有效地提升Hive查询的速度和资源利用率,为大数据分析提供更高效的平台。

    工作总结hive优化

    通过对Hive及其底层Hadoop的理解,结合实际案例分析,我们可以看到Hive优化是一个综合性的工作,涉及模型设计、查询优化、配置调整等多个方面。只有综合考虑各种因素,才能最大程度地发挥Hive的能力,提高大数据处理...

    Hive_优化——深入浅出学Hive

    4. **避免大量使用 `count(distinct)`**:在大数据量下,`count(distinct)` 效率低,因为它需要分组和排序,可以考虑使用其他方法如 BitMap 来优化。 5. **合并小文件**:小文件会导致更多的 Map 任务,影响调度...

    Hive SQL性能优化

    ### Hive SQL性能优化详解 #### 一、Hive SQL执行顺序及原理 了解Hive SQL的执行顺序,有助于我们写出更高效、更高质量的代码。Hive SQL的执行大致可以分为以下几个步骤: 1. **确定数据源**:首先确定查询的数据...

    HiveSQL解析原理.docx

    - **第一种**:仍然按照单个Distinct字段的方式进行,但这种方式无法对多个Distinct字段分别排序,需要在Reduce阶段使用Hash表来去重。 - **第二种**:对所有Distinct字段进行编号,每行数据生成多行数据,使得...

    hive的优化

    3. **聚合操作**:SUM和COUNT这类聚合操作通常不会引起数据倾斜问题,而COUNT(DISTINCT)则容易出现问题。 #### 二、Hive优化的关键点 1. **模型设计**:良好的数据模型可以大大减少后续处理过程中的复杂度,避免...

    Hive高级编程经验分享.pdf

    同时,Hive QL也支持COUNT(DISTINCT ...)功能,可以用来统计唯一值的数量。以下例子展示了如何计算每个pageid的唯一userid数量: ```sql SELECT pageid, COUNT(DISTINCT userid) FROM page_view GROUP BY pageid; `...

    hive,性能调优,全方面提升认知

    2. Hive的复杂HQL语句会转换成多个MapReduce Job,并行或串行执行,Job数比较多的作业运行效率相对比较低。 3. 聚合操作如sum、count、max、min、UDAF等不会受到数据倾斜的影响,因为MapReduce在Map阶段的预聚合操作...

    hive相关练习的数据data.rar

    SELECT user_id, COUNT(DISTINCT video_id) as watched_videos FROM user_info GROUP BY user_id ORDER BY watched_videos DESC LIMIT 10; ``` 此外,Hive还支持分区,这对于大型数据集尤其有用,可以提高查询效率...

    hive案列-游戏登陆信息分析.rar_hive.rar

    SELECT date, COUNT(DISTINCT player_id) AS daily_logins FROM game_login GROUP BY date; ``` 5. **优化查询性能**:Hive支持多种优化策略,如添加外部表、使用bucketing和skewjoin处理倾斜数据、使用Tez或...

    hive.ziphive数据迁移和数据分析

    在大数据处理领域,Hive...总结,Hive.ziphive数据迁移和数据分析涉及多个环节,从数据的导入、存储压缩到查询分析和结果导出,每个步骤都需精心设计和优化。理解并掌握这些知识点,对于大数据处理和分析工作至关重要。

    hive数据倾斜原因分析及解决方案.pdf

    大表与大表 Join,分桶的判断字段有很多空值或 null 值,导致某个 Reduce 处理的数据量远远高于平均值。 2. 原因:key 分布不均匀、业务数据本身的特性、建表时考虑不周、某些 SQL 语句本身就有数据倾斜。 3. 表现:...

    Hive中查询操作

    在Hive中,查询操作是数据处理的核心,它允许用户从大数据存储中提取所需的信息。以下将详细解析Hive查询语法及其基本查询方法。 一、Hive查询语法 Hive的查询语句遵循标准SQL的基本结构,但也有一些Hive特有的扩展...

    网站流量分析项目hive sql语句1

    - **BR(Bounce Rate)**:跳出率,计算方法是`select tab1.a/tab2.b from (select count(*)as a from dataclear where sscount=0 and reportTime="2018-01-08")as tab1,(select count(distinct ssid)as b from ...

    基于Facebook的Hive开发

    SELECT key, count(DISTINCT value) FROM src GROUP BY key; ``` 这是一个简单的分组查询示例,它计算每个`key`对应的唯一`value`的数量。 #### Hive查询语言详解 HiveQL支持丰富的SQL特性,包括但不限于: - **...

    Hive高级编程

    为了更好地理解 Hive 的工作原理及其优化技巧,我们可以通过具体的案例来进一步探讨。 假设有一个包含用户浏览行为的日志表 `page_view`,以及用户基本信息表 `user`。我们的目标是统计每个页面的访问人数及年龄...

Global site tag (gtag.js) - Google Analytics