Hive中4个By的区别?

1、Sort By:分区内有序

2、Order By:全局排序,只有一个Reducer

3、Distrbute By:类似MR中的Partition,进行分区,结合sort by使用

4、Cluster By:当Distrbute By和Sort By字段相同时,可以使用Cluster By方式。Cluster By除了具有Distrbute By的功能还有Sort By的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

窗口函数:

RANK()排序相同时会重复,总数不会变

DENSE_RANK()排序相同时会重复,总数会减少

ROW_NUMBER()根据顺序计算

调优方案:

Fetch抓取

Hive针对某些情况的查询可以不必使用MapReduce计算。例如select * from score;在这种情况下,Hive可以简单地读取source对应的存储目录下的文件,然后输出查询结果到控制台。通过设置hive.fetch.task.conversion参数,可以控制查询语句是否走了MapReduce。

假如hive.fetch.task.conversion设置成none,表示所有执行的查询语句都会走mr程序

假如hive.fetch.task.conversion设置成more,表示所有执行的查询语句都会走mr程序

本地模式

大多数的Hadoop Job是需要Hadoop提供完整的可扩展性来处理大数据集的。不过,有时候Hive的输入数据流是非常小的。在这种情况下,为查询触发执行任务时消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。

用户可以设置hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。

MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器就会在Reduce阶段完成join,容易发生数据倾斜。可以用MapJoinba把小表全部加载到内存在map端进行join,避免reducer处理。

set hive.auto.convert.join = true

大表小表的阈值设置(默认25M以下认为是小表)

set hive.mapjoin.smalltable.filesize = 25123456

Group By

默认情况下,Map阶段同一key数据分发给一个reduce,当一个key数据过大时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出结果。

是否在Map端进行聚合,默认为True

set hive.map.aggr = true;

在Map端进行聚合操作的条目数据

set hive.groupby.mapaggr.checkinterval = 100000;

有数据倾斜的时候进行负载均衡(默认是false)

set hive.groupby.skewindata = true

当选项设定为true,生成的查询计划会有两个MR Job,相当于相同的Group By Key会被分到不同的Reduce中

Count(distinct)

数据量大的时候,由于Count Distinct操作需要一个Reduce Task完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般Count Distinct使用先Group By再Count的方式替换

笛卡尔积

尽量避免笛卡尔积,意思就是避免join的时候不加on条件或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积。

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值