前面有一篇文章大概讲解了一下Hive的基本概念,其实Hive的本质就是通过写SQL语句来运行MapReduce操作,因此作为Hive使用者,HiveSQL的使用就对我们非常重要了。

        HiveSQL其实也是写SQL,只不过它与传统sql有以下几个方面的区别:

by函数 hive中group hivesql group by_by函数 hive中group

        可以看到,HSQ具有与生俱来的的处理大数据的能力,因为它是在MapReduce上执行的。Hive提供的字段类型有这些:

by函数 hive中group hivesql group by_字段_02

by函数 hive中group hivesql group by_hive_03

        这些字段其实经常使用的就个别几个,就简单做个了解即可,可以看到Hive提供的数据类型还是很全面的。

        在一个典型标准Hive语句中,其构成通常如下:

        select … from … where … group by … having … order by … 

执行顺序(这个面试常问)是:from ->where ->group by->select ->having ->order by

         可以结合各个字段的意思来理解它的顺序:首先from就是确定是从那张表里去取数据,where是进行过滤条件的筛选,做到只筛选满足条件的数据,使用group by可以确定好要分组的字段,按照上面的做好的规定,就可以select出来一部分数据了,对于选出来的数据,用having进行结果上的过滤(一般having是针对group by的聚合字段进行筛选),最后将结果排序order by即可。

基础语法

select A from B where C

        表明从B表中选取A列,并限定条件C。

使用group by + having(可选)

      select A,sum(B) from C where D group by E having F

        在基本使用的基础上加上了group by,对应地也要加上聚合字段sum(B),常用的聚合函数有:count(),sum(),avg(),max(),min()等。对于聚合字段sum(B),可以用having进行结果上的过滤。

使用order by

select A,sum(B) from C where D group by E order by F DESC/ASC

        对最终结果进行排序,可以指定是DESC降序,而ASC升序是默认情况,可写可不写。

        如果要对多字段进行排序的话,可以写成:order by F ASC,G DESC。表示先按F字段升序,再F字段相同的情况下,按G字段降序。

基础函数

1.将时间戳转化为日期的函数

        from_unixtime(time,’yyyyMMdd’)

        格式可以多种多样,比如yyyy-MM-dd hh:mm:ss或yyyy-MM-dd hh或yyyy-MM-dd hh:mm等。

2.反过来,将日期转化为时间戳的函数

       unix_timestamp(date)

3.计算日期间隔的函数

       datediff(结束日期,开始日期) 用来算两日期之间的间隔

4.增加日期/减少日期

       date_add(开始日期,天数) ,date_sub(开始日期,天数)

5.字符串相关的函数

       substr(要截取的字符串,开始位置,结束位置) 用来截取字符串

6.处理json格式的函数

       get_json_object(json字符串,’$.字段名’),获取json字符串中相应字段的值

       也可以直接json字符串[‘字段名’]来获取。

7.条件函数

       If(number>10.’’,’’) 用来判断和改变某一列的表现方式

       也可以用case when number>10 then ‘’ else ‘’ end.

        当然用case when可以加很多种情况,只不过最后记得要带上’else end’来结束。

8.列转行

        collect_set(),collect_list(),可与group by 一起使用。我认为这是一个非常实用的方法,很多时候要展示每个分组下的所有情况,就可以用到这两个,前者是集合可以去重,后者就用一个列表堆加在一起。

表连接

        左右连接:inner join /left join/right join/full join

by函数 hive中group hivesql group by_big data_04

        上下连接:union all

        Hive中只支持union all的操作,不支持union。这两者的区别是union all不去重不排序,只是上下相接;union可以实现去重和排序的目的。

窗口函数

       窗口函数就是在select列中额外添加的一个列,它可以根据前面某一列的分组做聚合,也可以计算从一开始到当前行的累计数值,一般它的格式为:

       Select,A,窗口函数() over (partition by… order by….rows between …and ….)  from B ……

        其中partition起到了分组的作用,order by表示先对某个字段进行排序,排完序后再计算窗口函数。而rows between …and ….一般来说没有这一部分,但加上它可以实现自己指定范围。

rows between unbounded preceding and current row 包括当前行和之前的所有行

rows between current row and unbounded following 包括当前行和之后的所有的行

rows between n preceding and current row 包括前n行和当前行

rows between n preceding and m following 包括前n行和后m行

       一、基本的窗口函数有:sum()avg()max()min(),这些也比较简单,可根据字面意思理解了。

       二、最常用的窗口函数:row_number()rank()dense_rank()这三者其实都是为了给字段进行排序,但区别如下:

       假如要给学生成绩排名,分别有这三个成绩:100分 100分 90分。那么:

                1.row_number()的结果就是 1 2 3,即它就是从一开始的自然数往下递增而已。

                2.rank()的结果则是 1 1 3,即相同成绩的排名会一样,但90分就直接排到第3。

                3.dense_rank(),带上dense了,结果为 1 1 2,排名不会出现空缺,不关注人数。

       三、较少用但有用的窗口函数:ntile(n),lead(),lag()

       ntile(n)是作用是将把当前数据分成n等块,在不同位置的数字有相应的标号。比如我们要把成绩平分成三个档次,则用ntile(3),就可以知道哪些成绩属于第一档,哪些第二档,哪些第三档。

       lag(字段名,偏移量,若取不到的默认值),lag是向前偏移,若有时候向前偏移的量超过了数据本身,就会自动用第三个参数“若取不到的默认值”来填充。

       lead(字段名,偏移量,若取不到的默认值),lead是向后偏移

        关于Hive的基础知识还有很多零散的小知识点,比如Hive调优,内部表外部表,分区表分桶表以及udf,udaf,udtf等,这些打算后面再单独拿出来放一起总结一下,关于HiveSQL的基础使用就总结到这里吧。