hive分析函数篇:函数高级

  • hive与关系型数据库
  • hive函数

part1: hive对比关系型数据库

hive: 基于Hadoop的一个数据仓库工具,将结构化的数据文件映射成一张表,并提供类sql语句的查询功能, 使用Hql作为查询接口,使用HDFS存储,使用mapreduce计算

mysqlhive
存储位置本地文件系统hdfs文件系统
表文件存储形式数据文件,索引文件metadata表(使用关系型数据库), 真实数据文件
数据格式系统定义用户自定义(serde,fileformat,compress)
作业引擎MyISAMmapreduce
使用场景online 事务处理(实时查询)online 分析(高延迟,读多写少,数据挖掘)
使用的脚本语言sqlhql
可扩展性

part2: hive分析函数

1,窗口函数+ 聚合函数+ 普通字段
hive (db)> select * from stu;
OK
stu.class_id	stu.stu_id	stu.score
1	1	90
1	2	94
1	3	87
1	4	89
2	4	96
2	2	59
2	1	75
3	2	67
3	1	87

现有数据如上:(如何用一条sql求出: 每班总分,平均分,最高分学生信息 ?)
1,hql实现

select * from (
select *, 
max(score)over(partition by class_id) max,
sum(score)over(partition by class_id) sum, 
avg(score)over( partition by class_id) avg
from stu )tmp
where tmp.score=tmp.max;

Total jobs = 1
OK
tmp.class_id	tmp.stu_id	tmp.score	tmp.max	tmp.sum	tmp.avg
1	2	94	94	360	90.0
2	4	96	96	230	76.66666666666667
3	1	87	87	154	77.0
Time taken: 3.266 seconds, Fetched: 3 row(s)

2, mysql实现

select stu.class_id, stu.stu_id, stu.score ,tab_max.max ,tab_sum.sum, tab_avg.avg from stu  

inner join (select class_id ,sum(score)sum  from stu  group by class_id) tab_sum 
on tab_sum.class_id=stu.class_id

inner join (select class_id ,avg(score)avg from stu group by class_id) tab_avg 
on tab_avg.class_id=stu.class_id

inner join (select class_id,max(score)max from stu group by class_id ) tab_max
on stu.class_id=tab_max.class_id

where stu.score=tab_max.max;

Total jobs = 10
OK
stu.class_id	stu.stu_id	stu.score	tab_max.max	tab_sum.sum	tab_avg.avg
1	2	94	94	360	90.0
2	4	96	96	230	76.66666666666667
3	1	87	87	154	77.0
Time taken: 119.113 seconds, Fetched: 3 row(s)

2, 一条语句 + 多个group by = 多条件分组(grouping sets, with cube, with rollup)
with cubegrouping setswith rollup
group 组合数1个条件(A)2(2^1)种 (0,1)1(2^1-1)种 (0)2(1+1)种 (0,1)
group 组合数2个条件(A,B)4(2^2)种(00,01,10,11)3(2^2-1)种 (01, 10,11)3(2+1)种 (00,01,11)
group 组合数3个条件(A,B,C)8(2^3)种 (000,001,010, 011 ,100, 101, 110, 111)7种(2^3-1)–(000,001,011,111)4(3+1)种(000,001,011,111)
group 组合数4个条件(A,B,C,D)16(2^4)种 (0000,0001,0010, 0100 ,1000, 1001, 1010, 1100…)15种(2^4-1)–(0000,0001,0010, 0100 ,1000, 1001, 1010, 1100…)5(4+1)种(0000,0001,0011,0111, 1111)

grouping__id : 根据group by后面声明的顺序字段是否存在于当前group by中的一个二进制位组合数据。【 比如(A,C)的grouping__id(A,C) = grouping(A)+grouping(B)+grouping ( C ) :二进制=101 也就是5】

hive (db)> select * from orders;
OK
orders.id	orders.produce_name	orders.price	orders.customerid
1	phone	7000.0	1
2	book	34.0	1
3	shooe	300.0	1
4	cup	90.0	5
5	book	34.0	2
6	shooe	300.0	2
7	cup	90.0	2
8	cup	90.0	3
9	cup	90.0	3
10	book	78.0	4
11	cup	90.0	5
#三个条件: grouping sets(...)
select customerid, price, produce_name,grouping__id gid from orders 
group by customerid,price,produce_name
grouping sets (
customerid,
price,
produce_name,

(customerid,price),
(customerid,produce_name),
(price,customerid),
(price,produce_name),
(customerid,price),
(customerid,produce_name),
(customerid,price,produce_name))
order by gid;
#三个条件: with cube/ with rollup
select customerid, price, produce_name,grouping__id gid from orders 
group by customerid,price,produce_name
with cube 
order by gid;
3, 分区内求最值(top k问题):LAG,LEAD,FIRST_VALUE, LAST_VALUE
hive (db)> select * from urls;
OK
urls.id	urls.visit_time	urls.url
USER1	2016-10-12 01:10:00	url1 
USER1	2016-10-12 01:15:10	url2          
USER1	2016-10-12 01:16:40	url3          
USER1	2016-10-12 02:13:00	url4          
USER1	2016-10-12 03:14:30	url5          
USER2	2016-11-12 01:10:00	url1          
USER2	2016-11-12 01:15:10	url2          
USER2	2016-11-12 01:16:40	url3          
USER3	2016-11-12 02:13:00	url2          
USER3	2016-11-12 03:14:30	url3 

有数据如上, 要求出: 每个用户的页面的访问次序,每个页面的访问时长

select tmp3.* ,first_value(tmp3.times)over(partition by tmp3.id order by tmp3.times desc) maxtime from (
select tmp2.id,tmp2.starts,tmp2.ends, nvl(tmp2.url1,'起始url')url1,tmp2.url2, 
nvl(tmp2.ends-tmp2.starts ,0)times from (
select tmp.id,tmp.starts, 
lead(tmp.starts,1,null)over(partition by tmp.id order by tmp.starts )ends,
lag(tmp.url)over(partition by tmp.id order by tmp.starts) url1,
tmp.url as url2 
from
(select id,url , 
unix_timestamp(visit_time,'yyyy-MM-dd HH:mm:ss') starts 
from urls )tmp
)tmp2
)tmp3;

Total jobs = 2
OK
tmp3.id	tmp3.starts	tmp3.ends	tmp3.url1	tmp3.url2	tmp3.times	maxtime
USER1	1476209580	1476213270	url3          	url4          	3690	3690
USER1	1476206200	1476209580	url2          	url3          	3380	3690
USER1	1476205800	1476206110	起始url	url1 	310	3690
USER1	1476206110	1476206200	url1 	url2          	90	3690
USER1	1476213270	NULL	url4          	url5          	0	3690
USER2	1478884200	1478884510	起始url	url1          	310	310
USER2	1478884510	1478884600	url1          	url2          	90	310
USER2	1478884600	NULL	url2          	url3          	0	310
USER3	1478887980	1478891670	起始url	url2          	3690	3690
USER3	1478891670	NULL	url2          	url3 	0	3690
4,分段/排名函数NTILE( n ), ROW_NUMBER, RANK, DENSE_RANK
hive (db)> select * from orders;
OK
orders.id	orders.produce_name	orders.price	orders.customerid
1	phone	7000.0	1
2	book	90.0	1
3	shooe	300.0	1
4	cup	90.0	1
8	book2	34.0	2
6	shooe	300.0	2
7	cup	34.0	2
13	video	30.0	5
11	cup	90.0	5
14	pc	9000.0	1
15	chair	200.0	5
16	chair2	200.0	5

数据如上, 要求出每个用户的商品购买总数,价格最高的由哪些? 价格最高的前1/3商品是哪些?

select * from (

select produce_name, price, customerid,
count(*)over(partition by customerid ) cnt,
rank()over(partition by customerid order by price desc )rk,
ntile(3)over(partition by customerid order by price desc) nt
from orders

)tmp 
where tmp.rk=1
or tmp.nt=1

OK
tmp.produce_name	tmp.price	tmp.customerid	tmp.cnt	tmp.rk	tmp.nt
pc	9000.0	1	5	1	1
phone	7000.0	1	5	2	1
shooe	300.0	2	3	1	1
chair	200.0	5	4	1	1
chair2	200.0	5	4	1	1

part3: 其他hive常用函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、关系运算: 4 1. 等值比较: = 4 2. 不等值比较: 4 3. 小于比较: < 4 4. 小于等于比较: 5 6. 大于等于比较: >= 5 7. 空值判断: IS NULL 5 8. 非空判断: IS NOT NULL 6 9. LIKE比较: LIKE 6 10. JAVA的LIKE操作: RLIKE 6 11. REGEXP操作: REGEXP 7 二、数学运算: 7 1. 加法操作: + 7 2. 减法操作: - 7 3. 乘法操作: * 8 4. 除法操作: / 8 5. 取余操作: % 8 6. 位与操作: & 9 7. 位或操作: | 9 8. 位异或操作: ^ 9 9.位取反操作: ~ 10 三、逻辑运算: 10 1. 逻辑与操作: AND 10 2. 逻辑或操作: OR 10 3. 逻辑非操作: NOT 10 四、数值计算 11 1. 取整函数: round 11 2. 指定精度取整函数: round 11 3. 向下取整函数: floor 11 4. 向上取整函数: ceil 12 5. 向上取整函数: ceiling 12 6. 取随机函数: rand 12 7. 自然指数函数: exp 13 8. 以10为底对数函数: log10 13 9. 以2为底对数函数: log2 13 10. 对数函数: log 13 11. 幂运算函数: pow 14 12. 幂运算函数: power 14 13. 开平方函数: sqrt 14 14. 二进制函数: bin 14 15. 十六进制函数: hex 15 16. 反转十六进制函数: unhex 15 17. 进制转换函数: conv 15 18. 绝对值函数: abs 16 19. 正取余函数: pmod 16 20. 正弦函数: sin 16 21. 反正弦函数: asin 16 22. 余弦函数: cos 17 23. 反余弦函数: acos 17 24. positive函数: positive 17 25. negative函数: negative 17 五、日期函数 18 1. UNIX时间戳转日期函数: from_unixtime 18 2. 获取当前UNIX时间戳函数: unix_timestamp 18 3. 日期转UNIX时间戳函数: unix_timestamp 18 4. 指定格式日期转UNIX时间戳函数: unix_timestamp 18 5. 日期时间转日期函数: to_date 19 6. 日期转年函数: year 19 7. 日期转月函数: month 19 8. 日期转天函数: day 19 9. 日期转小时函数: hour 20 10. 日期转分钟函数: minute 20 11. 日期转秒函数: second 20 12. 日期转周函数: weekofyear 20 13. 日期比较函数: datediff 21 14. 日期增加函数: date_add 21 15. 日期减少函数: date_sub 21 六、条件函数 21 1. If函数: if 21 2. 非空查找函数: COALESCE 22 3. 条件判断函数:CASE 22 4. 条件判断函数:CASE 22 七、字符串函数 23 1. 字符串长度函数:length 23 2. 字符串反转函数:reverse 23 3. 字符串连接函数:concat 23 4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:upper,ucase 24 8. 字符串转小写函数:lower,lcase 25 9. 去空格函数:trim 25 10. 左边去空格函数:ltrim 25 11. 右边去空格函数:rtrim 25 12. 正则表达式替换函数:regexp_replace 26 13. 正则表达式解析函数:regexp_extract 26 14. URL解析函数:parse_url 26 15. json解析函数:get_json_object 27 16. 空格字符串函数:space 27 17. 重复字符串函数:repeat 27 18. 首字符ascii函数:ascii 28 19. 左补足函数:lpad 28 20. 右补足函数:rpad 28 21. 分割字符串函数: split 28 22. 集合查找函数: find_in_set 29 八、集合统计函数 29 1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31 8. 总体标准偏离函数: stddev_pop 31 9. 样本标准偏离函数: stddev_samp 31 10.中位数函数: percentile 31 11. 中位数函数: percentile 31 12. 近似中位数函数: percentile_approx 32 13. 近似中位数函数: percentile_approx 32 14. 直方图: histogram_numeric 32 九、复合类型构建操作 32 1. Map类型构建: map 32 2. Struct类型构建: struct 33 3. array类型构建: array 33 十、复杂类型访问操作 33 1. array类型访问: A[n] 33 2. map类型访问: M[key] 34 3. struct类型访问: S.x 34 十一、复杂类型长度统计函数 34 1. Map类型长度函数: size(Map) 34 2. array类型长度函数: size(Array) 34 3. 类型转换函数 35
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根哥的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值