因为需要一个开始日期到结束日期的日期维度表(原本想用别的方式生成后导入hive,但是比较麻烦),于是查了资料后看到如下写法:
使用HiveSQL实现开始到结束日期之间的所有日期
https://blog.csdn.net/JnYoung/article/details/106097733
select
tmp.*,
t.*,
date_add(start_date, pos) as mid_date
from(
select
'1' as uid,
'2017-01-01' as start_date,
'2050-01-05' as end_date
) tmp lateral view posexplode(
split(space(datediff(end_date, start_date)), '')
) t as pos,
val;
Hive中有三种UDF:
1、用户定义函数(user-defined function)UDF;
2、 用户定义聚集函数(user-defined aggregate function , UDAF );
3、用户定义表生成函数(user-defined table-generating function, UDTF )。
UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。
UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出。lateral view explode()
简单来说:
UDF:返回对应值,一对一
UDAF:返回聚类值,多对一
UDTF:返回拆分值,一对多
hive-2 自定义函数UDF、UDAF、UDTF介绍及区别
资料1:https://blog.csdn.net/xiaofengguojiangnan/article/details/80059703
Lateral View的用法:
Lateral View与用户自定义生成函数即UDTF(如explode()或者split()等)结合使用。
(UDTF:为每一个输入行生成0个或者多个输出行)
Lateral View,可以将UDTF应用与基础表的每一行,将UDTF的结果连接到基础表上后,将连接后的结果表转换为一个有别名的虚拟表
语法:
lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。
由此可见,lateral view与explode等udtf就是天生好搭档,explode将复杂结构一行拆成多行,然后再用lateral view做各种聚合。
原文链接:https://blog.csdn.net/bitcarmanlee/article/details/51926530
推荐一篇操作简洁易懂的文章:https://zhuanlan.zhihu.com/p/115918587
1. explode函数
explode()函数,是表生成函数(user defined table generating functions)的一种,作用是接收一个 array 或 map 类型的数据作为输入,然后将 array 或 map 里面的元素按照每行的形式输出。其可以配合 LATERAL VIEW 一起使用,将explode输出的结果连接到基础表上后,将连接后的结果转换为一个有别名的虚拟表。
2. posexplode函数
posexplode相比explode,将一列数据转为多行之后,会输出数据的下标
上述生成日期维表sql的思路
- 用datediff计算结束日期到开始日期之间的天数
- 用space(n)生成对应数量的空字符
- 用split函数以空字符为分隔进行拆分
- 应用lateral view posexplod 将结果输出到多行,同时返回下标
- 最后用date_add(开始日期,下标)输出每一天的日期

本文介绍了如何利用HiveSQL结合UDTF(用户定义表生成函数)如LATERAL VIEW和POSEXplode来生成从开始日期到结束日期的所有日期。通过计算日期差值,使用split和explode函数拆分空格,再利用LATERAL VIEW将单行数据转化为多行,最终通过date_add函数得到每日日期。这种方法简化了生成日期维度表的过程。
1224

被折叠的 条评论
为什么被折叠?



