一、Hive的DDL语言(数据库、数据表的增删改查操作)
二、Hive的DQL语言(数据库查询语言)
2.1Hive七子句
聚合函数:count()、sum()、max()、min()、avg()可以单独使用。(缩写:cs mm a)
2.1.1 分区查询与分区裁剪
SELECT查询将扫描整个表(所谓的全表扫描)。如果使用PARTITIONED BY子句创建的分区表,则在查询时可以指定分区查询,减少全表扫描,也叫做分区裁剪。
如果select语句没有采用分区裁剪,默认还是使用全表扫描!
所谓分区裁剪
指的是:对分区表进行查询时,会检查WHERE子句或JOIN中的ON子句中是否存在对分区字段的过滤,如果存在,则仅访问查询符合条件的分区,即裁剪掉没必要访问的分区。
2.1.2 group by分组(在where后,where筛选后,group by聚合)
(出现在group by分组的字段必须出现在select中)
( 出现在select中的字段要么出现在group by分组中,要么出现在聚合函数中)
(group by 具有去重功能)
(分组操作必须和聚合函数一起使用)
在group by分组是最容易出现数据倾斜问题的?
答:① 分区、分桶 ② 开启Map端聚合(Map把数据划分为一个一个MapTask任务,Reduce通常是进行数据合并,默认情况下,所有的分组聚合操作都是发生在Reduce这一端,如果数据量比较大的情况下,就会导致耗时较长或者任务长时间无法完成)
Map端聚合 => 还可以解决未来数据倾斜的问题
Map聚合 => 优化手段
默认设置了set hive.map.aggr=true
,会在mapper端先group by一次,最后把结果merge起来,为了减少reducer处理的数据量。
2.1.3 having语句(having 子句 => 一般用于对分组后的数据进行过滤筛选)
和where相同点: where和having都能进行数据过滤。
和where不同点: where发生在group by之前,having发生在group by之后。
2.1.4limit语句
2.2HQL排序查询与高级查询
2.2.1ORDER BY
Hive SQL中的ORDER BY语法类似于SQL语言中的ORDER BY语法。会对输出的结果进行全局排序,因此底层使用MapReduce引擎执行的时候,只会有一个reducetask执行。也因此,如果输出的行数太大,会导致需要很长的时间才能完成全局排序。
2.2.2CLUSTER BY
Hive SQL中的CLUSTER BY语法可以指定根据后面的字段将数据分区,每个区内再根据这个字段asc正序排序(不允许指定排序规则),概况起来就是:根据同一个字段,分组排序。
cluster by 字段名称,主要做了两件事:① 按照这个字段分区 ② 针对每个区中的数据按照这个字段进行升序排序(记住,只能做到升序排序)
注意:使用了cluster by必须人为指定分组的数量 => Reduce数量
分组的规则hash散列。hash(col_name) % reduce task nums
2.2.3DISTRIBUTE BY + SORT BY
如果说CLUSTER BY的功能是分组排序(同一个字段),那么DISTRIBUTE BY + SORT BY就相当于把cluster by的功能一分为二:DISTRIBUTE BY负责分组,SORT BY负责分组内排序,并且可以是不同的字段。如果DISTRIBUTE BY +SORT BY的字段一样,可以得出下列结论:
CLUSTER BY=DISTRIBUTE BY +SORT BY(字段一样)