Hive的hql总结(后期会添加)

1、get_json_object

函数的作用:用来解析json字符串的一个字段:

格式get_json_object(json_txt, path): 从一个JSON字符串中取出指定路径对应的数据!
说明:第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;如果输入的json字符串无效,那么返回NULL。每次只能返回一个数据项。
$: 代表根对象
. : 获取子元素的操作符
[] : 获取一个数组中子元素的操作符

实例:

data =
{
 "store":
        {
         "fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear"}],  
         "bicycle":{"price":19.95,"color":"red"}
         }, 
 "id":"123456" 
}

1.get单层值

hive> select  get_json_object(data, '$.id') from test;
结果:123456

2.get多层值.

hive> select  get_json_object(data, '$.store.bicycle.price') from test;
结果:19.95

3.get数组值[]

hive> select  get_json_object(data, '$.store.fruit[0]') from test;
结果:{"weight":8,"type":"apple"}

2、concat(string s1, string s2, string s3)

这个函数能够把字符串类型的数据连接起来,连接的某个元素可以是列值。
如 concat( aa, ‘:’, bb) 就相当于把aa列和bb列用冒号连接起来了,aa:bb。
例子:

hive> select concat('1','2','3');
结果123

3、collect_list、collect_set

collect_list():根据某个字段分组后,把分在一组的数据合并在一起
collect_set():则是在collect_list()的基础上去重,同时当想将查询后的数据进行去重操作,可以利用该函数对分组后的数据进行去重。

4、cast

用法:cast(value as type)
功能:将某个列的值显示的转化为某个类型
如:cast(age as string ) 将int类型的数据转化为了String类型
例子:这里利用日期函数进行举例

hive> select from_unixtime(cast('1505456567' as int),'yyyy-MM-dd');
结果:2017-09-15

5、concat_ws(seperator, string s1, string s2…)

功能:制定分隔符将多个字符串连接起来,实现“列转行”
例子:常常结合group by与collect_set使用

表名example
表结构a string , b string , c int
数据为
c d 1
c d 2
c d 3
e f 4
e f 5
e f 6
select a, b, concat_ws(',' , collect_set(cast(c as string)))
from example 
group by a,b;
结果为
c d 1,2,3
e f 4,5,6

6、over partition by 与 group by的区别理解

  • group by是对检索结果的保留行进行单纯分组,一般和聚合函数一起使用例如max、min、sum、avg、count等一块用
  • partition by虽然也具有分组功能,但同时也具有其他的高级功能。

这里对二者都做一个实例进行对比:
一份数据
01 01 80
01 02 90
01 03 99
02 01 70
02 02 60
02 03 80
03 01 80
03 02 80
03 03 80
04 01 50
04 02 30
04 03 20
group by实例:

这里对每个学生id进行分组,求其成绩总分
select s_id,sum(s_score)
from workdb.score
group by s_id
结果如下
01      269
02      210
03      240
04      100

over partition by实例

一、
select s_id,sum(s_score) over (partition by s_id)
from workdb.score
显示结果:
01      269
01      269
01      269
02      210
02      210
02      210
03      240
03      240
03      240
04      100
04      100
04      100
解释:这里是先对组内数据进行相加,最后显示相加后的数据
二、
select 
s_id,
sum(s_score) over (partition by s_id order by s_score)
from workdb.score
结果显示:
01      80
01      170
01      269
02      60
02      130
02      210
03      240
03      240
03      240
04      20
04      50
04      100
解释:之所以跟上面显示不同,是因为通过设置order by对s_score输入的数据强制排序,默认升序,因此组内数据的相加方式是累加。

因此两者之间最主要的区别:

  • group by 更加强调的是一个整体,也就是组,通过与函数的结合使用,对组内的数据进行操作,最终显示每个组计算后的值。
  • 使用over开窗函数进行分组的话,是在整体后更强调个体,能显示组中所有个体的记录,用于给结果集分组。

7、if函数和case函数的用法

7.1if语句

语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)

select if(1>2,1,2)
结果显示:
2
即当testCondition条件成立时,会返回valueTrue,
否则返回valueFalseOrNull

7.2case语句

两种用法:
一:

case 
when tb1.os = 'android' then 'android'
when tb1.os = 'ios' then 'iPhone'
else 'PC'
end as os

二:

case tb1.os
when 'android' then 'android'
when 'ios' then 'iPhone'
else 'PC'
end as os

8、lag和lead函数

lag 和lead 可以 获取结果集中,按一定排序所排列的当前行的上下相邻若干offset 的某个行的某个列(不用结果集的自关联);
lag ,lead 分别是向前,向后;
lag 和lead 有三个参数,第一个参数是列名,第二个参数是偏移的offset,第三个参数是 超出记录窗口时的默认值)

举例如下:

select *  from yeardb;                                                                                                 
ID 			year
1 			2001                                                 
2 			2002                                                  
3 			2003
4			2004
5 			2005
select 
id,
year,
lag(year,1,0) over ( order by id )  yearago
from yeardb; 
                                                                  
ID 		year 		yearago     
1 		2001		0                                 
2 		2002       	2001
3 		2003       	2002
4 		2004       	2003
5 		2005       	2004
select 
id,
year,
lead(year,1,0) over ( order by id )  nextyear
from yeardb;
                                                                  
ID 		year 		nextyear     
1 		2001		2002                                 
2 		2002       	2003
3 		2003       	2004
4 		2004       	2005
5 		2005       	0
select 
id,
year,
lead(year,2,0) over ( order by id )  
from yeardb;                                                            


ID 		year 		nextyear     
1 		2001		2003                                 
2 		2002       	2004
3 		2003       	2005
4 		2004       	0
5 		2005       	0
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值