Loading...
墨滴

在IT中穿梭旅行

2021/09/22  阅读:25  主题:自定义主题1

Hive实战-自定义UDF

大家好,我是土哥。

今天,有位刚入职不久的学弟给我说,因为客户提的一个Hive需求,他没有实现出来,然后老板差点让他滚蛋。

收到学弟的问题后,我看了看,是一个Hive UDF需求,Hive提供的内置函数无法满足这个业务处理需要。

其实这个时候可以考虑使用用户自定义函数(UDF:user defined function).

前序

自定义函数类别:

UDF: 作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)

UDAF:(用户定义聚集函数):接收多个输入数据行,并产生一个输出数据行。(count,max)

客户需求

  1. 现有一个json脚本,需要将里面的字符串解析存储到Hive仓库中,要求每个字段对应相应的数据,
  2. 其中时间字段对应的数据秒转换成天数

需求1

将json脚本里面的字符串解析存储到Hive仓库中,要求每个字段对应相应的数据。 实现步骤如下:

json数据

通过上面的需求,我们知道hive提供的内置函数已经无法满足客户需求,所以这时需要我们自行定义内置函数。

使用IDEA进行代码编写 JsonParser 类继承UDF类 、 MovieRateBean类。

MovieRateBean类

JsonParser 类

将上述打包成jar包,上传到HDFS中,并且将json的数据也导入HDFS中。

启动hive数据仓库,然后在里面创建一个表,来后将json数据集导入表中,先将他们解析成一条一条的字符串

查询结果如下:

导入表中 因为这些数据现在只是字符串形式,所以需要将他们解析成数据库的字段形式,每个字段对应响应的数据

这时候将要用到我们定义的函数。 操作步骤如下:

查询结果如下:

我们可以看到,用函数解析之后,因为没有字符分割,所以只是将数据给整理好,但是对应的字段没有显示出来,所以接下来 我们需要重新创建一个表,然后分割成四段,让每一段数据对应他的字段。

执行结果如下:

需求2

其中时间字段对应的数据秒转换成天数

技术实现:Hive的 Transform 关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况

现在使用Transform关键字来实现

  1. 创建一个python脚本 然后在HDFS中创建一个文件将脚本复制进去并保存, 文件命名为weekday_mapper.py
  1. 将脚本添加到指定路径下
  2. 重新创建一个表 使用上述的python 脚本 4.待程序执行完之后进行查询 相应指令如下:

最终的查询结果如下:

我将这个代码发给那位学弟,告诉他,先韬光养晦半年,后面重新跳槽,这公司不行!!!

在IT中穿梭旅行

2021/09/22  阅读:25  主题:自定义主题1

作者介绍

在IT中穿梭旅行