Hive UDF、UDAF、UDTF 使用

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

因为需要一个开始日期到结束日期的日期维度表(原本想用别的方式生成后导入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的思路

  1. 用datediff计算结束日期到开始日期之间的天数
  2. 用space(n)生成对应数量的空字符
  3. 用split函数以空字符为分隔进行拆分
  4. 应用lateral view posexplod 将结果输出到多行,同时返回下标
  5. 最后用date_add(开始日期,下标)输出每一天的日期在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值