第十五章 Hive生产环境最佳实践

1、分区表和分桶表的应用场景

  • 注意事項:分区和分桶都会产生数据倾斜
1.1、分区表应用场景
  • 作用:提高查询效率

①在SQL中会按照某个字段进行过滤,建表的时候要按照这个字段作为分区字段

②数据基本上只会分析增量数据,不会分析全量数据,则应该按照时间来分区

1.2、分桶表应用场景
  • 作用:提高查询效率+进行抽样

①如果一个表的字段经常被Join查询条件,就应该建分桶表进行优化

select a.*,b.* from a join b on a.guid=b.guid
  • 注意事项:a表和b表都要分桶,而且分桶规则要一样(分桶字段一致,分桶个数成倍数关系)

  • 分析分桶join数据快的原因:hash散列提高关联效率

在这里插入图片描述

2、全局排序和局部排序

2.1、Order By
  • 含义:全局排序,最终使用一个reduceTask来完成排序,就算你设置了多个也没用
  • 注意事项:如果数据量很大,使用Order By来排序效率非常低
select * from table order by guid 
2.2、Sort By
  • 含义:局部排序,使用多个ReduceTask来运行,那么每个ReduceTask输出的结果是有序的,但整体结果无序。

  • 应用场景:数据量很大但是需要进行全局排序

select * from table sort by guid 
  • 实现方案:

使用一个Reducer,只输出一个Reduce文件

#进行相关参数设置
set mapreduce.job.reduces=1;

#SQL实现
select * from table order by guid desc

使用多个Reducer

  • 实现原理:范围分区(分桶distribute by)+局部排序(每个桶内进行sort by)
#进行相关参数设置
set mapreduce.job.reduces=4;

#SQL实现
select * from table distribute by(case when guid >= 0 then A 
                                  	   when guid >=10 then B 
                                       when guid >=20 then C
                                  else D) sort by guid 

在这里插入图片描述

  • 分桶规则指定:通过采样确定数据分布规律

①第一步:模糊采样

#采样方式:通过随机数的方式将数据打散分布,之后取前100条

select * from table  sort by rand() - 0.5 limit 100;

②第二步:确定范围

  • 将采样后的数据进行排序,之后切分10个分区来做
    • 第一个分区取最后一条数据,其余分区同理
2.3、distribute by
  • 含义:分桶查询
  • 应用场景:
    • ①必须设置reduceTask的个数
    • ②查询中,必须设置distribute by来设置分桶规则:hash散列
set mapreduce.job.reduce=3

select * from table distribute by guid
2.4、cluster by
  • 含义:如果sort by的字段和distribute by的字段一样,就可以简写
cluster by guid = distribute by guid order by guid
  • 运行规则:数据分成n段,每一段的ID都是按照hash散列的规则得到的结果都是一样,即hash(id)%n=余数

3、常用函数

3.1、str_to_map()
  • 作用:使用两个分隔符将文本拆分为键值对。 Delimiter1将文本分成K-V对,Delimiter2分割每个K-V对。对于delimiter1默认分隔符是’,‘,对于delimiter2默认分隔符是’='。
  • 在这里插入图片描述
  • 在这里插入图片描述
3.2、explode
  • 作用:将一行转换成多行
select explode(str_to_map("a:1,b:2,c:3",",",":"));

#运行结果
a     1
b     2
c     3
3.3、split()[]
  • 作用:通过固定字符对字符串进行切割,可通过索引获得切割后的结果

在这里插入图片描述

在这里插入图片描述

4、高级聚合函数

  • 高级聚合函数:相当于group by加强
4.1、Grouping sets
  • 作用:为自定义维度,根据需要分组即可
grouping sets((device_id),(os_id),(device_id,os_id),())<=>

group by device_id union all group by os_id union all  device_id,os_id

select 
  platform
  ,action
  ,count(guid)
  ,GROUPING__ID
  ,rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,'0')
from mtt_search.t_od_mtt_search_three_ecological_novel
where ds = 11111111
group BY
  platform
  ,action
grouping sets((platform),(action),(platform,action),())
  • 运行结果

在这里插入图片描述

4.2、cube函数
  • 作用:分组组合最全,是各个维度值的笛卡尔(包含null)组合,
group by a,b,c with cube <=> grouping sets((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),())

select 
  platform
  ,action
  ,count(guid)
  ,GROUPING_ID
from mtt_search.t_od_mtt_search_three_ecological_novel
where ds = 11111111
group BY
  platform
  ,action
with cube
  • 运行结果:

在这里插入图片描述

4.3、rollup函数
  • 含义:从右到做递减多级的统计
group by a,b,c with rollup <=> grouping sets((a,b,c),(a,b),(a),())

select 
  platform
  ,action
  ,count(guid)
  ,GROUPING_ID
from mtt_search.t_od_mtt_search_three_ecological_novel
where ds = 11111111
group BY
  platform
  ,action
with rollup
  • 运行结果

在这里插入图片描述

5、Hive处理Json数据

(1)原始数据如下

{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}
{"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"}
{"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"}
{"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"}
.....
{"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"}
{"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"}
{"movie":"2804","rate":"5","timeStamp":"978300719","uid":"1"}
{"movie":"594","rate":"4","timeStamp":"978302268","uid":"1"}

(2)要求导入结果如下

movieratetimestampuid
119359783007601

(3)解决方案

  • 方案:可用内置 get_json_object 或者 自定义函数完成
-- 第一步:先放入中间表
create database if not exists nx_de_json_db;
use nx_de_json_db;
drop table if exists rate_json;
create table rate_json(line string) row format delimited;
load data local inpath '/home/bigdata/rating.json' into table rate_json;

-- 第二步:创建结果表
create table rate(movie int, rate int, unixtime int, userid int) row format
delimited fields terminated by '\t';

-- 第三步:写解析语句进行插入
insert into table rate select
get_json_object(line,'$.movie') as moive,
get_json_object(line,'$.rate') as rate,
get_json_object(line,'$.timeStamp') as unixtime,
get_json_object(line,'$.uid') as userid
from rate_json;

6、企业三大面试题

6.1、最大值&累计值

(1)需求描述

  • 原始表
#用户名,月份,访问次數
A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
A,2015-02,4
A,2015-02,6
B,2015-02,10
B,2015-02,5
A,2015-03,16
A,2015-03,22
B,2015-03,23
B,2015-03,10
B,2015-03,11
  • 报表产出
#每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数
A 1 20 20 20
A 2 10 30 20
A 3 30 60 30
A 4 50 110 50
.....
B 1 2 2
B 2 10 12
B 3 20 32
B 4 50 82

(2)代码实现

  • 第一步:先统计每个人的每个月的PV
  • 第二步:之后通过分析函数每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数,平均单月访问量,最小单月访问量
select
	a.name,
	a.month,
	a.pv,
	sum(a.pv) over (partition by a.name order by a.month rows between 	unbounded preceding and current row) as sumpv,
	max(a.pv) over (partition by a.name order by a.month rows between unbounded preceding and current row) as maxpv,
	min(a.pv) over (partition by a.name order by a.month rows between unbounded preceding and current row) as minpv,
	avg(a.pv) over (partition by a.name order by a.month rows between unbounded preceding and current row) as avgpv
from
(select b.name as name, b.month as month, sum(b.pv) as pv from exercise_pv b
group by b.name, b.month) a;
6.2、行列转换

(1)行转列

  • 作用:本身返回一张虚拟表,使用later view可直接关联两张表,保持原有映射关系。
# Map数据进行行转列
select
t1.uid
,t2.key
,t2.value
from t1
later view explode(map(
'c1',c1,
'c2',c2,
'c3',c3
)) t2 as key,value

# 字符串数据进行行转列
select s.name,temp.x from s later view explode(split('score',',')) temp as x

(2)列转行

  • 作用:将多行数据融为一行
str_to_map(concat_ws(','collect_set(':',key_clm,value_clm))))
select
uid
,kv['c1'] as c1
,kv['c2'] as c2
,kv['c3'] as c3
from(
select
uid
,str_to_map(concat_ws(','collect_set(':',key_clm,value_clm)))) kv
from vtable
group by uid
) temp
6.3、TopN实现

(1)需求描述

  • 源表数据
#id,name,age,favors
#id,姓名,年龄,爱好

1,huangxiaoming,45,a-c-d-f
2,huangzitao,36,b-c-d-e
3,huanglei,41,c-d-e
4,liushishi,22,a-d-e
5,liudehua,39,e-f-d
6,liuyifei,35,a-d-e
  • 报表产出
#求出每种爱好中,年龄最大的两个人(爱好,年龄,姓名)注意思考一个问题:如果某个爱好中的第二大年龄有多个相同的怎么办?
a huangxiaoming 45
a liuyifei 35
b huangzitao 36
c huangixaoming 45
c huanglei 41

(2)代码实现

  • 思路总结:
    • 1、explode() + lateral view
    • 2、求TopN + row_number()
from
(
select b.id, b.name, b.age, b.favor,
row_number() over (partition by b.favor order by b.age desc) as rank
from
(
select a.id as id, a.name as name, a.age as age, favor_view.favor
from exercise_topn a
LATERAL VIEW explode(split(a.favors, "-")) favor_view as favor
) b
) c
where c.rank <= 2;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Hive on Spark是大数据处理中的最佳实践之一。它将Hive和Spark两个开源项目结合起来,使得Hive可以在Spark上运行,从而提高了数据处理的效率和速度。Hive on Spark可以处理大规模的数据,支持SQL查询和数据分析,同时还可以与其他大数据工具集成,如Hadoop、HBase等。在实际应用中,Hive on Spark可以用于数据仓库、数据分析、机器学习等领域,是一种非常实用的大数据处理方案。 ### 回答2: 随着大数据应用的不断增多,越来越多的企业开始关注大数据技术的实现与应用。Hive是基于Hadoop的开源数据仓库系统,它提供了一种类似于SQL的语言,使得非技术用户能够方便地查询大量数据。而Spark则是现在最流行的分布式计算框架,因其内存计算功能,比Hadoop更加高效和快速。 在实践中,Hive on Spark将两个框架结合在一起,提供了更高效和实用的解决方案。在Hive on Spark中,数据可以通过Spark来加速计算和查询,从而实现更高效的大数据处理。Hive on Spark集成了Spark的强大内存计算引擎,可以支持更大规模的数据处理和更快速的查询处理,同时还可以提供更好的性能、更低的延迟和更低的处理成本。 Hive on Spark采用了Spark作为计算框架,Spark可以很快地对Hive上的数据进行处理,因此可以处理数百亿条数据。此外,由于Spark是基于内存的计算框架,因此可以大大提高计算速度,并消除了磁盘IO瓶颈。因此,Hive on Spark可以支持更快的查询响应时间和更高的用户并发性能。 除了这些,Hive on Spark还提供了更简单的应用管理和维护,对提高大数据处理效率和时间的优化非常有利。同时,它还提供了机器学习和深度学习模型的处理能力,从而可以实现更广泛的数据分析应用。尤其对于非技术人员,通过Hive on Spark,用户可以快速地实现自己的数据分析需求,从而实现有效管理和使用数据。 总之,Hive on Spark是目前最有效和实用的大数据处理和管理框架之一。它使得数据分析变得更加简单和高效,并可以快速满足业务需求,使企业在大数据技术和应用方向上取得更大成就。 ### 回答3: Hive on Spark是一种基于Apache Spark的分布式计算系统,它将Apache Hive和Spark技术相结合,提供了更加高效的数据处理和分析能力。在大数据行业中,Hive on Spark已经成为了一种最佳实践,因为它能够帮助企业实现更快的数据处理速度和更高的数据处理能力。 首先,Hive on Spark可以让企业更加轻松地使用Spark进行数据处理和分析。Apache Spark是一种流行的分布式计算框架,拥有强大的数据处理能力和高效的架构。而Hive on Spark将Hive SQL和Spark技术相结合,让企业用户能够以更加简单的方式使用Spark进行数据分析和处理。 其次,Hive on Spark能够极大地提高数据处理的速度和能力。Hive on Spark通过将Hive SQL转换为Spark的RDD操作,能够在分布式环境下对大规模数据进行高效的处理和分析。相比于传统的Hadoop集群,Hive on Spark可以提供更高的数据处理速度和更高的数据处理能力,能够帮助企业更加顺畅地进行数据分析和决策。 最后,Hive on Spark还具有可扩展性和灵活性。企业用户可以根据自身的需求对Spark集群进行扩容或者缩容,以满足更加多样化的数据处理需求。同时,Hive on Spark还支持多种数据格式,包括Hive表、CSV、JSON等,能够帮助企业更加灵活地处理不同类型的数据。 总之,Hive on Spark是大数据行业最佳实践之一,它能够帮助企业客户更加方便地使用Spark进行数据处理和分析,提高数据处理的速度和能力,同时还具有可扩展性和灵活性等特点,能够帮助企业更加高效地进行数据分析和决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随缘清风殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值