咱们本期内容大部分HQL操作都须要依赖如下两张表,具体的数据内容如下:

course

student

1、SELECT查问语句

SELECT 查问语句比较简单,前面跟要查问的字段,如下所示:

hive (hypers)> select name from student;OKnameRoseJackJimmyTomJerry

能够为查问语句中的列和表加上别名,如下所示:

hive (hypers)> select t.name from student t;OKt.nameRoseJackJimmyTomJerry

能够应用如下语句进行嵌套查问:

hive (hypers)> select a.name, b.coursename             > from (select stuid, name from student) a             >          join (select stuid, coursename from course) b on a.stuid = b.stuid; OKa.name  b.coursenameRose    C语言Jack    JavaJimmy   高等数学Tom     离散数学Jerry   C++

能够应用正则表达式指定查问的列,如下所示:

hive (hypers)> select t.* from student t;OKt.stuid t.name  t.sex   t.age15317408        Rose    1       2115317412        Jack    0       2015317432        Jimmy   1       2115317423        Tom     1       2015317478        Jerry   0       1915317467        Alice   0       20

能够应用 LIMIT 限度查问的后果条数,如下所示:

hive (hypers)> select * from student limit 1;OKstudent.stuid   student.name    student.sex     student.age15317408        Rose    1       21

能够应用ORDER BY语句对后果进行排序,升序咱们能够不在排序的字段后加上ASC(默认),然而倒序须要指定DESC,如下所示:

hive (hypers)> select * from student order by age desc;OKstudent.stuid   student.name    student.sex     student.age15317432        Jimmy   1       2115317408        Rose    1       2115317467        Alice   0       2015317423        Tom     1       2015317412        Jack    0       2015317478        Jerry   0       19Time taken: 10.631 seconds, Fetched: 5 row(s) hive (hypers)> select * from student order by age;OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       1915317467        Alice   0       2015317423        Tom     1       2015317412        Jack    0       2015317432        Jimmy   1       2115317408        Rose    1       21

咱们还能够应用CASE...WHEN...THEN语句对某一列的值进行解决,如下所示:

hive (hypers)> SELECT stuid,             >        name,             >        age,             >        sex,             >        CASE             >            WHEN sex = '1' THEN '男'             >            WHEN sex = '0' THEN '女'             >            ELSE '未知'             >            END             >        FROM student;OKstuid   name    age     sex     _c415317408        Rose    21      1       男15317412        Jack    20      0       女15317432        Jimmy   21      1       男15317423        Tom     20      1       男15317478        Jerry   19      0       女15317478        Alice   20      0       女

2、WHERE 条件语句

WHERE 条件语句次要是对查问进行条件限度,如下所示:

hive (hypers)> select * from student where age = 21;OKstudent.stuid   student.name    student.sex     student.age15317408        Rose    1       2115317432        Jimmy   1       21

3、GROUP BY 语句

GROUP BY语句次要是对查问的数据进行分组,通常会和聚合函数一起应用,如下所示:

hive (hypers)> select sex,avg(age) from student group by sex;OKsex     _c10       19.6666666666666681       20.666666666666668

4、HAVING语句

HAVING语句次要用来对GROUP BY语句的后果进行条件限度,如下所示:

hive (hypers)> select sex,avg(age) from student group by sex having avg(age) > 20;OKsex     _c11       20.666666666666668

5、INNER JOIN语句

在 INNER JOIN 语句中,只有进行连贯的两个表中都存在与连贯条件相匹配的数据时才会被显示在后果数据中,如下所示:

hive (hypers)> select t1.name,t2.coursename from student t1 join course t2 on t1.stuid = t2.stuid;OKt1.name t2.coursenameRose    C语言Jack    JavaJimmy   高等数学Tom     离散数学Jerry   C++

6、 LEFT OUTER JOIN语句

LEFT OUTER JOIN语句示意左外连贯,左外连贯查问数据会蕴含左表中的全副记录,而右表中不符合条件的后果将以NULL的模式呈现,如下所示:

hive (hypers)> select t1.name,t2.coursename from student t1 left outer join course t2 on t1.stuid = t2.stuid;OKt1.name t2.coursenameRose    C语言Jack    JavaJimmy   高等数学Tom     离散数学Jerry   C++Alice   NULL

7、RIGHT OUTER JOIN语句

RIGHT OUTER JOIN示意右外连贯,右外连贯查问数据会蕴含右表中的全副记录,而左表中不符合条件的后果将以 NULL 的模式呈现,如下所示:

hive (hypers)> select t1.name,t2.coursename from student t1 right outer join course t2 on t1.stuid = t2.stuid;OKt1.name t2.coursenameRose    C语言Jack    JavaJimmy   高等数学Tom     离散数学Jerry   C++NULL    大数据利用开发

8、FULL OUTER JOIN语句

FULL OUTER JOIN语句示意全外连贯,后果数据会蕴含左表和右表的全副数据,不符合条件的用NULL示意,如下所示:

hive (hypers)> select t1.name,t2.coursename from student t1 FULL  outer join course t2 on t1.stuid = t2.stuid;OKt1.name t2.coursenameRose    C语言Jack    JavaTom     离散数学Jimmy   高等数学NULL    大数据利用开发Alice   NULLJerry   C++

9、 LEFT SEMI JOIN语句

LEFT SEMI JOIN语句示意左半连贯,其后果数据对应右表满足 ON 语句中的条件,如下所示:

hive (hypers)> select t1.name from student t1 LEFT SEMI JOIN course t2 on t1.stuid = t2.stuid;OKt1.nameRoseJackJimmyTomJerry

留神:| 在 LEFT SEMI JOIN 语句中,SELECT 和 WHERE 子句中不能引用右表中的字段。|

10、笛卡尔积 JOIN 语句

笛卡尔积 JOIN 语句 示意左表的行数乘以右表的行数等于后果集的大小,如下所示:

hive (hypers)> select * from student join course;OKstudent.stuid   student.name    student.sex     student.age     course.stuid    course.coursename     course.score15317408        Rose    1       21      15317408        C语言   5015317412        Jack    0       20      15317408        C语言   5015317432        Jimmy   1       21      15317408        C语言   5015317423        Tom     1       20      15317408        C语言   5015317478        Jerry   0       19      15317408        C语言   5015317467        Alice   0       20      15317408        C语言   5015317408        Rose    1       21      15317412        Java    6015317412        Jack    0       20      15317412        Java    6015317432        Jimmy   1       21      15317412        Java    6015317423        Tom     1       20      15317412        Java    6015317478        Jerry   0       19      15317412        Java    6015317467        Alice   0       20      15317412        Java    6015317408        Rose    1       21      15317432        高等数学        7015317412        Jack    0       20      15317432        高等数学        7015317432        Jimmy   1       21      15317432        高等数学        7015317423        Tom     1       20      15317432        高等数学        7015317478        Jerry   0       19      15317432        高等数学        7015317467        Alice   0       20      15317432        高等数学        7015317408        Rose    1       21      15317423        离散数学        8015317412        Jack    0       20      15317423        离散数学        8015317432        Jimmy   1       21      15317423        离散数学        8015317423        Tom     1       20      15317423        离散数学        8015317478        Jerry   0       19      15317423        离散数学        8015317467        Alice   0       20      15317423        离散数学        8015317408        Rose    1       21      15317478        C++     9015317412        Jack    0       20      15317478        C++     9015317432        Jimmy   1       21      15317478        C++     9015317423        Tom     1       20      15317478        C++     9015317478        Jerry   0       19      15317478        C++     9015317467        Alice   0       20      15317478        C++     9015317408        Rose    1       21      15317463        大数据利用开发  10015317412        Jack    0       20      15317463        大数据利用开发  10015317432        Jimmy   1       21      15317463        大数据利用开发  10015317423        Tom     1       20      15317463        大数据利用开发  10015317478        Jerry   0       19      15317463        大数据利用开发  10015317467        Alice   0       20      15317463        大数据利用开发  100

留神:| 如果将 Hive 的属性hive.mapred.mode 设置为 strict,则会阻止执行笛卡尔积查问。 |

11、map-side JOIN语句

map-site JOIN语句会在Map阶段将小表读到内存,间接在 Map 端 进行JOIN,这种连贯须要在查问语句中显式申明,如下所示:

SELECT /* + MapJOIN(t1) */ s1.stuid,s2.stuid  from student s1 JOIN student s2 ON s1.stuid = s2.stuid;

能够通过设置Hive的属性 hive.auto.convert.join=true主动开启 map-side JOIN;也能够设置 Hive 的属性 hive.mapjoin.smalltable.filesize定义表的大小,默认为 25 000 000 B。

12、多表JOIN语句

Hive反对多张表进行连贯,语句如下所示:

hive (hypers)> SELECT *               FROM test1 t1               JOIN test2 t2 ON t1.id = t2.id               JOIN test3 t3 ON t2.id = t3.id

每个 JOIN 都会启动一个 MapReduce 作业。第一个MapReduce作业连贯 test1 表和 test2 表,第二个MapReduce作业连贯第一个MapReduce作业的输入后果和 test3 表。

13、ORDER BY 和 SORT BY 语句

Hive中的 ORDER BY语句和SQL语句一样,能够实现对后果集的排序,如下所示:

hive (hypers)> select * from student order by age asc,stuId desc;OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       1915317467        Alice   0       2015317423        Tom     1       2015317412        Jack    0       2015317432        Jimmy   1       2115317408        Rose    1       21

Time taken: 11.929 seconds, Fetched: 6 row(s)

上述语句示意依照age字段升序,stuId字段降序排序。

如果Hive表中的数据十分多,应用 ORDER BY排序可能会导致执行的工夫过长,此时能够设置Hive的属性 hive.mapred.mode为strict,则排序语句前面必须加上 LIMIT限度查问的后果条数,以防止数据量太多造成的执行工夫过长的问题,如下所示:

hive (hypers)> SET hive.mapred.mode = strict;hive (hypers)> select * from student order by age asc,stuId desc limit 100;OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       1915317467        Alice   0       2015317423        Tom     1       2015317412        Jack    0       2015317432        Jimmy   1       2115317408        Rose    1       21Time taken: 9.378 seconds, Fetched: 6 row(s)

SORT BY语句会在每个Reduce中对数据进行排序,能够保障每个Reduce输入的数据是有序的(全局不肯定有序),并能够进步全局排序的性能,如下所示:

hive (hypers)> select * from student sort by age asc,stuId desc limit 100;OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       1915317467        Alice   0       2015317423        Tom     1       2015317412        Jack    0       2015317432        Jimmy   1       2115317408        Rose    1       21

上述语句会在每个Reduce中对age字段进行升序排序,同时对create_time字段进行降序排序。如果Reduce个数为1,则ORDER BY和SORT BY语句的查问后果雷同;如果Reduce个数大于1,则SORT BY输入的后果为部分有序。

14、 DISTRIBUTE BY 和 SORT BY语句

DISTRIBUTE语句联合SORT BY语句能够实现在第一列数据雷同时,可能依照第二列数据进行排序,如下所示:

hive (hypers)> select * from student distribute by sex sort by age,stuId;OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       1915317412        Jack    0       2015317423        Tom     1       2015317467        Alice   0       2015317408        Rose    1       2115317432        Jimmy   1       21

DISTRIBUTE BY语句可能保障sex雷同的数据进入同一个 Reduce 函数,大数据培训在 Reduce中再依照 age 和 stuId 排序即可实现在第一列数据雷同时,依照第二列数据排序。

15、CLUSTER BY语句

如果 DISTRIBUTE BY 和 SORT BY语句中的列完全相同,并且都是依照升序排序,则能够应用CLUSTER BY语句代替DISTRIBUTE BY和SORT BY语句,如下所示:

select * from student distribute by age sort by age;

下面的语句等价于:

hive (hypers)> select * from student cluster by age;OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       1915317467        Alice   0       2015317423        Tom     1       2015317412        Jack    0       2015317432        Jimmy   1       2115317408        Rose    1       21

16、类型转换

类型转换能够应用 cast(value As TYPE)语法,如下所示:

hive (hypers)> select * from student where cast(stuId AS INT) >= 15317450;OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       1915317467        Alice   0       20

上述语句示意将 stuId 转化为 INT 类型。

17、分桶抽样

Hive反对分桶抽样查问,如下所示:

hive (hypers)> SELECT * FROM student TABLESAMPLE (BUCKET 2 OUT OF 6 ON stuid);OKstudent.stuid   student.name    student.sex     student.age15317467        Alice   0       20

上述语句示意查问时候6个桶,取第2个桶,分桶的根据是将id值的哈希值除以桶数6的余数。也能够采纳随机抽样的形式,如下所示:

hive (hypers)> SELECT * FROM student TABLESAMPLE (BUCKET 2 OUT OF 6 ON RAND());OKstudent.stuid   student.name    student.sex     student.age15317478        Jerry   0       19Time taken: 0.04 seconds, Fetched: 1 row(s)

能够在创立表时指定分桶,须要提前将 Hive 的 hive.enforce.bucketing属性设置为 true。该属性能够在 hive-site.xml文件中配置,如下所示:

<property>        <name>hive.enforce.bucketing</name>        <value>true</value></property>

也能够在Hive命令行设置,如下所示:

hive (default)> SET hive.enforce.bucketing = true;

创立表时指定分桶,并插入 student 表中的 id列数据,如下所示:

hive (hypers)> CREATE TABLE test_bucket(id INT) CLUSTERED BY (id) INTO 3 BUCKETS ;OKTime taken: 0.086 secondshive (hypers)> INSERT OVERWRITE TABLE test_bucket SELECT stuid FROM student;OKstuidTime taken: 24.261 seconds

上述语句首先创立一个 test_bucket表,并将 test_bucket 表划分为3个桶,而后将 student 表中的 id 列数据插入 test_bucket表中。插入的数据会被保留在3个文件中,每个桶一个文件,保留在 test_bucket表门路下。

18、 UNION ALL 语句

Hive 反对 UNION ALL查问,其次要用于多表数据合并的场景。应用 UNION ALL语句要求各表查问出的字段类型必须齐全匹配,如下所示:

SELECT t.id,t.nameFROM (SELECT t1.id,t1.name FROM test1 t1UNION ALLSELECT t2.id,t2.name FROM test2 t2UNION ALLSELECT t3.id,t3.name FROM test3 t3) t

留神:| 在Hive中应用 UNION ALL语句,必须应用嵌套查问 。 |