Hive基础知识记要 (四)之hive优化

hive的优化

1.排序:
order by 全局排序 默认hive中 1reducetask
sort by 局部排序 每一个reducetask内部做排序
set reducetasks=3
字段.hash % 3 随机
1 zs f 23 cs reducetask0
1 zs f 23 cs reducetask1
1 zs f 23 cs reducetask2
distribute by 分桶|分组|分区
进行数据分配的
distribute by name + sort by
name.hash % 3
cluster by 字段
distribute by 字段+ sort by 字段

2.笛卡尔积
select * from a join b;
a表的每一条数据 关联b表的所有数据
最终的数据条数 ab 1001000=100000
在hive中有些需求 必须使用笛卡尔积
select * from a join b;
如何转换为mr的
map端:
key:“” null
value:标记+数据记录
reduce端:
一组
a表所有数据 b表所有的数据
没有关联键 数据只能在一个reducetask中完成 效率低下
解决:
人为添加一个关联键
1)先对相对大的表进行添加一列关联字段 指定一个范围 0-99
select *,round(rand()*100) from a
1000 1 2 4 7
2) 将小表复制多份 取决于大表的关联键范围 100
每一份小表 添加一个关联键 大表范围中的一个
3)关联
提升整体的并行度 减轻了数据倾斜

总体占比
select sum(package) sum_package from unicom;
select
province,sum(package) p_sum
from unicom
group by province;

3)hive中不支持 in/exists 执行效率极低
高效 left semi join | inner join

面试:
hive中如何实践 not in
4)如何设计 maptask的数量
当大量的小文件的时候
启动过多的maptask任务
任务的启动时间 远远大于 任务的执行时间 不划算
jvm的重用
一个maptsk---- 一个container ----> 1yarnhild (jps)—》1jvm
一个container 中 执行多个maptask|reducetask
set mapred.job.reuse.jvm.num.tasks=5
一个container 运行5个maptask
Job job_1565283590751_0008 running in uber mode : false
uber: 默认10个maptask | reducetask 一个container

5)reducetask的数量
经验值 0.95datanode的个数 最大限制
500 9zk 2namenode 489
0.95

6)合理的分区
减少数据的扫描范围 提升性能
分区字段 过滤的字段
dept
select * from stu where dept=“CS”;
select * from stu where age>18; 查询所有的分区
生产上习惯 使用日期作为分区 按日期进行数据分析

7)合理的分桶
insert
insert into table stu_buk
select * from test_shell.stu;
1)提升抽样的性能
age %3
—0 buket0
—1 buket1
—2 buket2
TABLESAMPLE(BUCKET x OUT OF y)
y:桶簇 一个或多个桶 半个桶 3 一个桶簇—一个桶
x: 取得第几个桶簇的数据 1

select * from stu_buk tablesample(bucket 1 out of 3);
y=6 一个桶簇半个桶
x=1  第一个桶簇   第一个桶前半
x=2  第二个桶簇   第二个桶后半
轮询

桶   12个
桶簇   3个    一个桶簇  4个桶
    桶簇1    1+4+7+10
2)提升join的性能 
分桶 字段   关联 
分桶个数 相同或倍数关系

8)hql语句
单条
单重
多重
数据插入的时候 能用多重不用单重
9)join
先过滤 在join
小表在前 大表在后

hive重点:
hql sql
数据存储
hive的数据组织形式 内部表 外部表 分区表 分桶表
分区表:
数据加载方式
动态
静态
动态分区 静态分区区别
hive查询
语法
join
inner
outer
left outer join | left join
semi join
having
where
函数
常用内置函数
字符串 instr split substr concat concat_ws length
数字:
rand()
round()
收集函数:
collect_set
collect_list
array_contains
日期函数:
from_unixtime
unix_timestamp
day month hour
条件:
if
case when
nvl
炸裂函数
explode

        自定义函数:
            实现  实现功能
            
        UDF    UDTF   UDAF 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值