drop table if exists tab_demo_student;
CREATE TABLE IF NOT EXISTS tab_demo_student(
Sno int,
Sname string,
Sex string,
Sage int,
Sdept string)
row format delimited fields terminated by ','stored as textfile;
drop table if exists tab_demo_course;
CREATE TABLE IF NOT EXISTS tab_demo_course(
Cno int,
Cname string)
row format delimited fields terminated by ',' stored as textfile;
drop table if exists tab_demo_sc;
CREATE TABLE IF NOT EXISTS tab_demo_sc
(Sno int,Cno int,Grade int)
row format delimited fields terminated by ',' stored as textfile;
load data local inpath '/home/sc.txt' overwrite into table test.tab_demo_sc;
load data local inpath '/home/course.txt' overwrite into table test.tab_demo_course;
SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
- 查询全体学生的学号与姓名
hive> select sno,sname from student; Total MapReduce jobs = 1
- 查询选修了课程的学生姓名
hive> select distinct sname from student inner join sc on student.sno=sc.sno; Total MapReduce jobs = 2
hive.map.aggr控制我们怎样去聚合,默认值为false,如果设置为ture后,会在map任务里执行第一级别的聚合,通常这样会有 高的效率,但是需要更大的内存。
- 查询学生的总人数
Total MapReduce jobs = 1
- 计算1号课程的学生平均成绩
hive> select avg(distinct Grade) from sc where sno=1;
- 查询选修1号课程的学生最高分数
grade
98
- 求各个课程号及相应的选课人数
Total MapReduce jobs = 1
- 查询选修了3门以上的课程的学生学号
Total MapReduce jobs = 1
sno
95002
95004
95005
95006
95007
95011
95012
95013
95015
95018
95019
95022
Total MapReduce jobs = 1
sno
95002
95004
95005
95006
95007
95011
95012
95013
95015
95018
95019
95022
Total MapReduce jobs = 1
Launching Job 1 out of 1
sno count_cno
95002 4
95004 4
95005 4
95006 6
95007 4
95011 4
95012 4
95013 4
95015 4
95018 4
95019 5
95022 4
hive> select sno from test.tab_demo_student order by sno;
FAILED: SemanticException 1:47 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'sno'
95021 周二 男 17 MA
95008 李娜 女 18 CS
95017 王风娟 女 18 IS
95015 王君 男 18 MA
95005 刘刚 男 18 MA
95011 包小柏 男 18 MA
95009 梦圆圆 女 18 MA
95007 易思玲 女 19 MA
95014 王小丽 女 19 CS
95002 刘晨 女 19 IS
95019 邢小丽 女 19 IS
95018 王一 女 19 IS
95010 孔小涛 男 19 CS
95004 张立 男 19 IS
95022 郑明 男 20 MA
95012 孙花 女 20 CS
NULL 李勇 男 20 CS
95013 冯伟 男 21 CS
95016 钱国 男 21 MA
95020 赵钱 男 21 IS
95003 王敏 女 22 MA
95006 孙庆 男 23 CS
- join只支持等值连接 e.g.
- 如果join on的key值不是相同的话,会转化为2个map/reduc e.g. 如果key相同的话会转化为一个map/reduce job,由于第一个job的map/reduce的结果会缓冲起来,然后再跟第二个进行join,所以为了减少内存,必须把量少的放在第一个join上。
- LEFT,RIGHT 和 FULL OUTER 关键字用于处理 join 中空记录的情况。
Join 发生在WHERE 子句之前。如果你想限制 join 的输出,应该在 WHERE 子句中写过滤条件——或是在join 子句中写。这里面一个容易混淆的问题是表分区的情况:
SELECT a.val, b.val FROM a
LEFT OUTER JOIN b ON (a.key=b.key)
WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'
会 join a 表到 b 表(OUTER JOIN),列出 a.val 和 b.val 的记录。WHERE 从句中可以使用其他列作为过滤条件。但是,如前所述,如果 b 表中找不到对应 a 表的记录,b 表的所有列都会列出NULL,包括 ds 列。也就是说,join 会过滤 b 表中不能找到匹配 a 表 join key 的所有记录。这样的话,LEFT OUTER 就使得查询结果与 WHERE 子句无关了。解决的办法是在 OUTER JOIN 时使用以下语法:
SELECT a.val, b.val FROM a LEFT OUTER JOIN b
ON (a.key=b.key AND
b.ds='2009-07-07' AND
a.ds='2009-07-07')
这一查询的结果是预先在 join 阶段过滤过的,所以不会存在上述问题。这一逻辑也可以应用于 RIGHT 和 FULL 类型的 join 中。
Join 是不能交换位置的。无论是 LEFT 还是 RIGHT join,都是左连接的。
SELECT a.val1, a.val2, b.val, c.val
FROM a
JOIN b ON (a.key = b.key)
LEFT OUTER JOIN c ON (a.key = c.key)
- LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现。Hive 当前没有实现 IN/EXISTS 子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
可以被重写为:
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
- 如果2个join的表非常小的话,join的过程可能只在mapper中就可以完成。
- 如果有两个表join on的值为buckets列,并且buckets数量相同的话,可以只在mapper阶段完成。e.g.
SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key
在mapper阶段,可以对b的值按buckets进行取值,a表的一个buckets取b表的一个buckets进行join,这样做并不是模式的,必须设置。
set hive.optimize.bucketmapjoin = true
- 练习:
- 好的模型设计事半功倍。
- 解决数据倾斜问题。
- 减少job数。
- 设置合理的map reduce的task数,能有效提升性能。(比如,10w+级别的计算,用160个reduce,那是相当的浪费,1个足够)。
- 了解数据分布,自己动手解决数据倾斜问题是个不错的选择。set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化有时不能适应特定业务背景,开发人员了解业务,了解数据,可以通过业务逻辑精确有效的解决数据倾斜问题。
- 数据量较大的情况下,慎用count(distinct),count(distinct)容易产生倾斜问题。
- 对小文件进行合并,是行至有效的提高调度效率的方法,假如所有的作业设置合理的文件数,对云梯的整体调度效率也会产生积极的正向影响。
- 优化时把握整体,单个作业最优不如整体最优。