1.1.1列转行
就是把一列数据转化成多行,如下:
内嵌插叙:
- explode:展开
列表中的每个元素生成一行
- lateral view:虚拟表
侧视图的意义是配合explode,一个语句生成把单行数据拆解成多行后的数据结果集。
解释:lateral view 会将explode生成的结果放到一个虚拟表中,然后这个虚拟表会和当前表
join,来达到数据聚合的目的。
结构解析:要进行聚合的虚拟表,lateral view explode(字段) 虚拟表名 as 虚拟表字段名
统计每个学生的总成绩:
1.1.2 行转列
就是把多行数据转化成一行数据:
- 准备数据
- collect_set函数:
它们都是将分组中的某列转为一个数组返回
- 将数据写成array格式:
它们都是将分组中的某列转为一个数组返回
- 将数据写成array格式:
有数据如下:
创建map类型的表
加载数据
Map格式数据查询
1.2.1Map列转行
使用上面的数据
explode 展开数据
Lateral view
Lateral View和split,explode等一起使用,它能够将一行数据拆成多行数据,并在此基础上对拆分后的数据进行聚合。
1.4.1数据准备
可以用下面两个命令查看Hive中的函数
因为Hive的核心功能和海量数据统计分析,而在统计分析时日期时间是一个非常重要的维度,所以日期函数在Hive使用中尤为重要.
- 默认的数据库的查询都是要么详细记录,要么聚合分析,如果要查询详细记录和聚合数据,必须要经过两次查询
- 简单的说窗口函数对每条详细记录开一个窗口,进行聚合统计的查询
- 默认mysql老版本没有支持,在最新的8.0版本中支持, Oracle和Hive中都支持窗口函数
3.2.1 over开窗
使用窗口函数之前一般要通过over()进行开窗,简单可以写成函数+over简单的写法如下:
注意:
- 窗口函数是针对每一行数据的
- 如果over中没有参数,默认的是全部结果集
需求:查询在2018年1月份购买过的顾客购买明细及总人数
3.2.2partition by子句
在over窗口中进行分区,对某一列进行分区统计,窗口的大小就是分区的大小
需求:查看顾客的购买明细及月购买总额
3.2.3 order by
order by子句会让输入的数据强制排序
3.2.4Window子句
3.3.1 ntile
用于将分组数据按照顺序切分成n片,返回当前切片值
例子
3.3.2 lag和lead函数
- lag返回当前数据行的上一行数据
- lead放回当前数据行的下一行数据
需求:查询顾客上次购买的时间
取得顾客下次购买的时间
3.3.3first_value和last_value
- first_value取分组内排序后,截至到当前行,第一个值
- last_value 分组内排序后,截至到当前行,最后一个值
- row_number从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列
- rank()生成数据项在分组中的排名,排名相等会在名词中留下空位
- dense_rank()生成数据项在分组中的排名,排名相等会在名词中不会留下空位
准备数据多次的考试成绩
需求1:对每次考试按照考试成绩倒序
需求2:获取每次考试的排名情况
需求3:求每次考试的前三名