Hive优化,
set hive.groupby.skewindata=true;
当HQL语句中有GROUP BY时,默认情况下,Hive将具有相同分组键的数据放入同一个Reducer。如果分组键的不同值具有数据倾斜,则一个Reducer可能会获得大部分数据,与其他Reducer相比,这个Reducer需要更长的时间才能完成。
通过设定set hive.groupby.skewindata=true;,Hive会触发一个额外的MR作业使得Maper的结果随机分配给Reducer。\
动态分区
当我们向分区表插入数据时,通常需要指定分区:
INSERT INTO TABLE student PARTITION(inc_day='20180929') SELECT id,name FROM another_table;
当分区很多时,这样一个个分区的插法会令人窒息!
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
Error: GC overhead limit exceeded
set hive.optimize.sort.dynamic.partition=true;
Hive Insert to Dynamic Partition Query Generating Too Many Small Files
create table student(
id string comment '学号',
name string comment '姓名',
sex string comment '性别',
age string comment '年龄',
dept_id string comment '学院ID'
) comment '学生表';
create table department(
id string comment '学院ID',
name string comment '学院名字'
) comment '学院表 ';
insert into student values('1','孙悟空','男','18','01');
insert into student values('2','明世隐','男','19','01');
insert into student values('3','高渐离','男','20','02');
insert into student values('4','孙尚香','女','21','02');
insert into student values('5','安琪拉','女','22','03');
insert into department values('01','信息学院');
insert into department values('02','法学院');
insert into department values('03','艺术学院');
insert into department values('01','信息学院');
JOIN(即INNER JOIN)
LEFT JOIN
坑1:右边的表ID不唯一,造成
select * from student left join department on student.dept_id=department.id order by student.id;
1 孙悟空 男 18 01 01 信息学院
1 孙悟空 男 18 01 01 信息学院
2 明世隐 男 19 01 01 信息学院
2 明世隐 男 19 01 01 信息学院
3 高渐离 男 20 02 02 法学院
4 孙尚香 女 21 02 02 法学院
5 安琪拉 女 22 03 03 艺术学院
hive 设置队列需要根据所使用的引擎进行对应的设置才会有效果,否则无效
设置引擎
set hive.execution.engine=mr;
set hive.execution.engine=spark;
set hive.execution.engine=tez;
如果使用的是mr(原生mapreduce)
SET mapreduce.job.queuename=etl;
如果使用的引擎是tez
set tez.queue.name=etl
设置队列(etl为队列名称,默认为default)
spark…暂未使用
打印选项
set hive.cli.print.header=true; # 打印列名
set hive.resultset.use.unique.column.names=false; # 列名前不带表名前缀