接上篇博客:

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 _偏门常用查询函数(二)附带实例(列转行、窗口函数)相关推荐

  1. Hive _偏门常用查询函数(三)附带实例(Rank)

    接上两篇博客 Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 Hive _偏门常用查 ...

  2. Hive _偏门常用查询函数(一)附带实例(空字段赋值、 CASE WHEN、行转列)

    空字段赋值 函数说明 NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with).它的功能是如果string1为NULL,则NVL函数返回replace_wit ...

  3. MapInfo中常用查询函数及用法

    MapInfo中常用查询函数及用法: 函数用途 语法 备注 图层中选点 Str$(obj)="point": Str(String)表示字符串:point表示点: 图层中选线 St ...

  4. ABP 多模块关联查询、分组统计、列转行、Vue 复合表头动态列

    本文记录了一次使用abp Core5 ,vue 开发复杂报表的经历. 0.需求概述 业务需求是:统计一个化工厂车队形式记录数据中异常停车的报表,维度可以按照车俩.驾驶员两个维度进行统计,统计的元素有: ...

  5. python中len的用法_总结Python中len()函数的使用实例

    这篇文章主要简单介绍了Python中的len()函数的使用,包括在四种情况下的使用小例子,是Python学习当中的基础知识,需要的朋友可以参考下 函数:len() 1:作用:返回字符串.列表.字典.元 ...

  6. oracle --高级函数应用-pivot (列转行)

    系列文章目录 oracle --高级函数应用-pivot使用 文章目录 系列文章目录 一.pivot 作用? 二.使用步骤 1.创建表 2.插入数据 3.查询结果 总结 提示:以下是本篇文章正文内容, ...

  7. mysql 函数返回查询结果_MySQL数据库中常用查询函数简介

    MYSQL中的常用函数 count(*)--- 相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. select count(*) from yinxiong; Count(列名) ...

  8. MYSQL常用查询函数

    文章目录 常见函数: 数学函数: 日期函数: 其他函数: 流程控制函数: CASE函数 case 函数的使用二:类似于 多重if 概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法 ...

  9. mysql 查看数据库函数_MySQL数据库中常用查询函数简介

    MYSQL中的常用函数 count(*)--- 相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录. select count(*) from yinxiong; Count(列名) ...

最新文章

  1. HLG 1481 Attack of the Giant n-pus【二分+二分图完全匹配】
  2. vue源码构建代码分析
  3. Diango REST framework 视图继承图
  4. 上海奋斗记--从3500到700W(转)
  5. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
  6. Visual Basic中实现带预览的对话框
  7. 【数据结构与算法】之深入解析“实现strStr()”的求解思路与算法示例
  8. Flexbox 布局
  9. 你还想让我怎样-线程同步(理论篇)
  10. IntelliJ Idea学习笔记004--- idea修改格式化代码快捷键_顺带一个激活地址_以及常用快捷键
  11. Exchange 2013 OU大于500新建用户无法查询OU
  12. c语言文本作图输出爱心,C语言程序设计——文本作图简案(3页)-原创力文档...
  13. JAVA SE 7虚拟机规范
  14. 通达OA v12流程中心
  15. ZEMAX知识点:坐标间断面(coordinate break)
  16. java 转换tif图片为jpg,解决转换后颜色异常问题
  17. 自然语言处理NLP中的N-gram模型
  18. 入职阿里两年的工作总结
  19. 云文件共享服务器,云文件共享服务器
  20. web前端是什么?需要掌握什么技术

热门文章

  1. 2019ICPC(沈阳) - Fish eating fruit(树形dp+树根转移)
  2. HDU1850(Nim游戏)
  3. PE文件结构详解(二)可执行文件头
  4. 逆向工程核心原理学习笔记(九):小端序标记法2
  5. 大侠稍等!URL 中为何出现奇怪的字符
  6. 操作系统 :银行家算法的实现(C++)
  7. e.printStackTrace() 会导致锁死?
  8. RabbitMQ负载均衡(4)——LVS
  9. 无人值守的自动 dump(一)
  10. 开启未来十年的编码技术之门