Hive 自定义函数

导读

大家好,我是数据开发者,非常感谢大家最近的关注,你们的关注是我持续输出的动力,让我们共同提高。

大数据平台下的数据仓库搭建过程中存在许多个性化的业务需求,或者说是系统需求,无法在 Hive 提供的内置函数中找到解决办法,为了解决这个问题,我们可以使用 Hive 自定义函数满足这种个性化需求。我们本篇就使用 Hive 中的自定义函数实现几种数仓搭建过程中的需求。

Hive 有哪些自定义函数?

Hive 中存在三种类型的函数,分别是 UDF, UDAF, UDTF,这三种类型的 UDF 分别是:

UDF(user defined function):用户自定义函数,操作单行数据,并产生单行数据,也就通常理解的单进单出,与 concat,nvl 等类似; UDAF(user defined aggregation function):用户自定义聚合函数,操作多行数据,并产生单条数据,与常见的 sum,count 函数类似,也可以理解为多进一出; UDTF(user defined table-generating function):用户自定义表生成函数,操作单行数据,并产生多行输出,可以理解为一进多出,类似于 Hive 内置的 explode 函数。

以上三种类型的函数对我们理解数据开发过程有很大帮助,无论是关系型数据库,还是大数据平台的数据开发,这三种类型分别代表了三种数据处理方式,可以映射到数据仓库开发过程中的 ETL 过程,为了更好的理解这三种自定义函数,我们需要使用 Java 开发自定义函数。

开发环境准备

本次代码可以通过代码包的方式发送给大家参考学习,大家可以关注公众号后发送 udf 获取代码包。

1,JDK 1.8.0
2,Eclipse 2022-06 (4.24.0)
2,Maven 3.8.1
3,Hive 3.1.2

除了以上软件的准备之外,我们还需要准备一张表,这张表结构如下:

字段名称 字段类型 业务含义
id int 代理键
name string 姓名
order_dte string 订单日期
formula string 计算公式

根据上面的表结构准备测试样例数据,样例数据如下所示:

create table udf_exmaple(
id int,
name string,
order_dte string,
formula string
)
comment 'udf example'
stored as parquet;
OK
Time taken: 0.405 seconds

select id,name,order_dte, formula from udf_example;

id name order_dte formula
4029 udf_test4029 2021-12-12 1*3*2000/4029
4028 udf_test4028 2021-12-11 1*3*2000/4028
4027 udf_test4027 2021-12-10 1*3*2000/4027
4026 udf_test4026 2021-12-09 1*3*2000/4026
4025 udf_test4025 2021-12-08 1*3*2000/4025

UDF 开发过程

为了能够掌握 Hive UDF 的开发, 我们设定如下需求:

  • 通过 UDF 实现 eval() 公式,该函数可以完成字符串公式的计算,比如 eval(4/2) = 2.0;

1),首先通过终端控制台进入项目创建目录,通过下面的 maven archetype 创建 maven 项目,也可以通过 eclipse 创建项目向导创建 maven 项目。

mvn archetype:generate \
-DgroupId=com.data.developer \   
-DartifactId=UDF \
-DpackageName=com.data.developer.udf \
-Dversion=1.0 \
-DinteractiveMode=false \

2),打开 eclipse 开发工具,并导入第一步创建的 Maven 项目;

导入 Maven 项目
导入 Maven 项目

3),UDF 项目 POM 内容如下,其中依赖项中的 元素的作用是控制依赖元素的使用范围。通俗的将,就是控制 Jar 包在哪些范围被加载和使用。包括编译,测试,运行,并且还可以加上是否被打入包中。常见的作用域范围有: compile, test, provided, runtime, system, import。默认值是 compile,是比较强的依赖,适用于所有阶段,意味着依赖会被打包,随着项目一起发布,在编译,测试,运行都有效。我们这里对其中一个依赖包使用了编译范围,其余 Hive 相关依赖包在运行环境不需要,就使用了 provided 范围,所以运行时 provided 范围的依赖不会被打包。


  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值