• hive窗口函数

1、Over子句

在深入研究Over字句之前,一定要注意:在SQL处理中,窗口函数都是最后一步执行,而且仅位于Order by字句之前。

统计2019年4月份每个人的购买记录次数
select name,count(*) over ()
from odist
where otime = '2019-04'
group by name

-------执行结果
mart 2 
jack 2

》》执行
select name,count(*)
from odist
where otime = '2019-04'
group by name

-----》》输出结果
mart 1
jack 1
mart 1 
jack 1

2、partition by子句

Over子句之后第一个提到的就是Partition By.Partition By子句也可以称为查询分区子句,非常类似于Group By,都是将数据按照边界值分组,而Over之前的函数在每一个分组之内进行,如果超出了分组,则函数会重新计算.

统计顾客的购买明细及月购买总额
select name,otime,cost,sum(cost) over(partition by month(otime))
from odist
--------查询结果:
name    otime   cost    sum_window_0
jack    2015-01-01  10  76
jack    2015-01-08  10  76
jack    2015-01-07  10  76
jack    2015-01-05  46  76
jack    2015-02-03  23  23
neil    2015-05-10  12  12
neil    2015-06-12  80  80

3、order by子句

order by子句会让输入的数据强制排序

select name,otime,cost,sum(cost) over(partition by month(otime) order by otime )
from odist
  • hive 数据倾斜
1、空值产生的数据倾斜

解决方案 1:user_id 为空的不参与关联
解决方案 2:赋予空值新的 key 值


2、不同数据类型关联产生数据倾斜
用户表中 user_id 字段为 int,log 表中 user_id 为既有 string 也有 int 的类型, 当按照两个表的 user_id 进行 join 操作的时候,
默认的 hash 操作会按照 int 类型的 id 进 行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中。

解决方案: 把数字类型 id 转换成 string 类型的 id。
3、大小表关联查询产生数据倾斜
注意:使用map join解决小表关联大表造成的数据倾斜问题。这个方法使用的频率很高。
map join 概念:将其中做连接的小表(全量数据)分发到所有 MapTask 端进行 Join,从 而避免了 reduceTask,前提要求是内存足以装下该全量数据。

在 hive0.11 版本以后会自动开启 map join 优化,由两个参数控制:
set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启
set hive.mapjoin.smalltable.filesize=25000000 //设置小表不超过多大时开启 mapjoin 优化
如果是大大表关联呢?那就大事化小,小事化了。把大表切分成小表,然后分别 map join
  • map join和reduce join
1、hive 中的join可分为俩类,一种是common join(也叫Reduce join或shuffle join),另一种是 map join,
后者是对hive join的一个优化,利用本地的task对较小的表hash生产一个hashtable文件,然后直接和map出来另一个表进行匹配,最终完成join.

2、set hive.auto.convert.join = false 在0.7.0到0.10.0版本默认是false,表示不使用优化
3、set hive.auto.convert.join = true在0.11.0到之后的版本是ture,代表使用优化

reducejoin

0e13b2928a70019d1ff1bdb77f50bc34.png

MapJoin

491a270e508ed101c6af010b7bd039a6.png

1、通过执行计划可以看出,正常的join是使用俩个map和一个reduce来完成join,因为过程中有shuffle,所以会有网络io,执行效率相对较小。

2、使用优化的map join过程中没有shuffle,是通过本地的一个task hash较小的表(较小的表的识别可以通过元数据信息判断)生成hashtable file文件,并保存到hdfs的临时缓存当中,然后通过与map出来的另一个表进行直接匹配,得出结果,因此过程中没有shuffle,不需要网络,所以效率相对来说较快,即为优化。

参见:

CSDN-专业IT技术社区-登录​blog.csdn.net

4、

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐