Hive _偏门常用查询函数(二)附带实例(列转行、窗口函数)
接上篇博客:
Hive _偏门常用查询函数(一)附带实例
https://blog.csdn.net/qq_41946557/article/details/102904642
列转行
1.函数说明
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
2.数据准备
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》 战争,动作,灾难
建表:
create table movie_info(movie string, category array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";
load data local inpath "/root/movie" into table movie_info;
需求:将电影分类中的数组数据展开。
selectmovie,category_name
from movie_info lateral view explode(category) table_tmp as category_name;
结果展示:
窗口函数
1.相关函数说明
OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化
CURRENT ROW:当前行
n PRECEDING:往前n行数据
n FOLLOWING:往后n行数据
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点
LAG(col,n):往前第n行数据
LEAD(col,n):往后第n行数据
NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。
2.数据准备:name,orderdate,cost
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
建表:
create table business(
name string,
orderdate string,
cost int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
load data local inpath "/root/business" into table business;
需求:
- 查询在2017年4月份购买过的顾客及总人数
select name,count(*) over ()
from business
where substring(orderdate,1,7) = '2017-04'
group by name;
结果展示:
- 查询顾客的购买明细及月购买总额
select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;select name,orderdate,cost,sum(cost) over(distribute by month(orderdate)) from business;
结果展示:
+-------+-------------+-------+---------------+--+
| name | orderdate | cost | sum_window_0 |
+-------+-------------+-------+---------------+--+
| jack | 2017-01-01 | 10 | 205 |
| jack | 2017-01-08 | 55 | 205 |
| tony | 2017-01-07 | 50 | 205 |
| jack | 2017-01-05 | 46 | 205 |
| tony | 2017-01-04 | 29 | 205 |
| tony | 2017-01-02 | 15 | 205 |
| jack | 2017-02-03 | 23 | 23 |
| mart | 2017-04-13 | 94 | 341 |
| jack | 2017-04-06 | 42 | 341 |
| mart | 2017-04-11 | 75 | 341 |
| mart | 2017-04-09 | 68 | 341 |
| mart | 2017-04-08 | 62 | 341 |
| neil | 2017-05-10 | 12 | 12 |
| neil | 2017-06-12 | 80 | 80 |
+-------+-------------+-------+---------------+--+
- 上述的场景,要将cost按照日期进行累加
按部分析:
0: jdbc:hive2://henu2:10000> select * from business order by orderdate;
日期 排序查询后的结果:
+----------------+---------------------+----------------+--+
| business.name | business.orderdate | business.cost |
+----------------+---------------------+----------------+--+
| jack | 2017-01-01 | 10 |
| tony | 2017-01-02 | 15 |
| tony | 2017-01-04 | 29 |
| jack | 2017-01-05 | 46 |
| tony | 2017-01-07 | 50 |
| jack | 2017-01-08 | 55 |
| jack | 2017-02-03 | 23 |
| jack | 2017-04-06 | 42 |
| mart | 2017-04-08 | 62 |
| mart | 2017-04-09 | 68 |
| mart | 2017-04-11 | 75 |
| mart | 2017-04-13 | 94 |
| neil | 2017-05-10 | 12 |
| neil | 2017-06-12 | 80 |
+----------------+---------------------+----------------+--+
cost按照日期进行累加
0: jdbc:hive2://henu2:10000> select *,sum(cost) over(sort by orderdate rows between UN
BOUNDED PRECEDING and CURRENT ROW) from business;
结果展示:
三行一算:
0: jdbc:hive2://henu2:10000> select *,sum(cost) over(sort by orderdate rows between 1
preceding and 1 following) from business;
结果展示:
另外补充,自行演示:
select name,orderdate,cost,
sum(cost) over() as sample1,--所有行相加
sum(cost) over(partition by name) as sample2,--按name分组,组内数据相加
sum(cost) over(partition by name order by orderdate) as sample3,--按name分组,组内数据累加
sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一样,由起点到当前行的聚合
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--当前行和前边一行及后面一行
sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行
from business;
结果展示:
- 查询顾客上次的购买时间
0: jdbc:hive2://henu2:10000> select *,lag(orderdate,1) over(distribute by name sort byorderdate) from business;
结果展示:
补充:
select *,
lag(orderdate,1) over(distribute by name sort by orderdate),
lead(orderdate,1) over(distribute by name sort by orderdate)
from business;
结果展示:
- 查询前20%时间的订单信息
首先:分为5个组
select *,ntile(5) over(sort by orderdate) from business;
结果展示:
最终语句:
select name,orderdate,cost
from
(select name,orderdate,cost,ntile(5) over(sort by orderdate) gid from business) t
where t.gid = 1;
结果展示:
Hive _偏门常用查询函数(二)附带实例(列转行、窗口函数)相关推荐
- Hive _偏门常用查询函数(三)附带实例(Rank)
接上两篇博客 Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 Hive _偏门常用查 ...
- Hive _偏门常用查询函数(一)附带实例(空字段赋值、 CASE WHEN、行转列)
空字段赋值 函数说明 NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with).它的功能是如果string1为NULL,则NVL函数返回replace_wit ...
- MapInfo中常用查询函数及用法
MapInfo中常用查询函数及用法: 函数用途 语法 备注 图层中选点 Str$(obj)="point": Str(String)表示字符串:point表示点: 图层中选线 St ...
- ABP 多模块关联查询、分组统计、列转行、Vue 复合表头动态列
本文记录了一次使用abp Core5 ,vue 开发复杂报表的经历. 0.需求概述 业务需求是:统计一个化工厂车队形式记录数据中异常停车的报表,维度可以按照车俩.驾驶员两个维度进行统计,统计的元素有: ...
- python中len的用法_总结Python中len()函数的使用实例
这篇文章主要简单介绍了Python中的len()函数的使用,包括在四种情况下的使用小例子,是Python学习当中的基础知识,需要的朋友可以参考下 函数:len() 1:作用:返回字符串.列表.字典.元 ...
- oracle --高级函数应用-pivot (列转行)
系列文章目录 oracle --高级函数应用-pivot使用 文章目录 系列文章目录 一.pivot 作用? 二.使用步骤 1.创建表 2.插入数据 3.查询结果 总结 提示:以下是本篇文章正文内容, ...
- mysql 函数返回查询结果_MySQL数据库中常用查询函数简介
MYSQL中的常用函数 count(*)--- 相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. select count(*) from yinxiong; Count(列名) ...
- MYSQL常用查询函数
文章目录 常见函数: 数学函数: 日期函数: 其他函数: 流程控制函数: CASE函数 case 函数的使用二:类似于 多重if 概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法 ...
- mysql 查看数据库函数_MySQL数据库中常用查询函数简介
MYSQL中的常用函数 count(*)--- 相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. select count(*) from yinxiong; Count(列名) ...
最新文章
- HLG 1481 Attack of the Giant n-pus【二分+二分图完全匹配】
- vue源码构建代码分析
- Diango REST framework 视图继承图
- 上海奋斗记--从3500到700W(转)
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
- Visual Basic中实现带预览的对话框
- 【数据结构与算法】之深入解析“实现strStr()”的求解思路与算法示例
- Flexbox 布局
- 你还想让我怎样-线程同步(理论篇)
- IntelliJ Idea学习笔记004--- idea修改格式化代码快捷键_顺带一个激活地址_以及常用快捷键
- Exchange 2013 OU大于500新建用户无法查询OU
- c语言文本作图输出爱心,C语言程序设计——文本作图简案(3页)-原创力文档...
- JAVA SE 7虚拟机规范
- 通达OA v12流程中心
- ZEMAX知识点:坐标间断面(coordinate break)
- java 转换tif图片为jpg,解决转换后颜色异常问题
- 自然语言处理NLP中的N-gram模型
- 入职阿里两年的工作总结
- 云文件共享服务器,云文件共享服务器
- web前端是什么?需要掌握什么技术