5、Hive的自定义UDF函数

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、pom.xml引入依赖及打包

<dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.1.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.0</version></dependency>
</dependencies><build><plugins><!-- 配置java插件,指定版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><encoding>UTF-8</encoding><source>1.8</source><target>1.8</target><showWarnings>true</showWarnings></configuration></plugin></plugins>
</build>

2、对单个字段,或者多个字段进行处理

import utils.CommonUtils;
import org.apache.hadoop.hive.ql.exec.UDF;/*** [@Author](https://my.oschina.net/arthor) liufu* @CreateTime 2017/5/4 14:13* @Descrition*/
public class AllTracksUDF extends UDF {// 重载方法// 处理Int类型字段// 及时要插入的表中字段为int、bigint类型等,都可以用string类型插入进去// int类型数据,在传入参数的时候直接传递数字即可,比如:evaluate(power, 1)public Integer evaluate(String column, int columnType) {String longValue = getStringValue(column);if(longValue != null){return Integer.parseInt(longValue);}return null;}// 处理Long类型字段,包括时间// long类型参数,传递columnType的时候要加上"L", 比如:evaluate(startTime, 1L)public Long evaluate(String column, long columnType) {String longValue = getStringValue(column);if(longValue != null){// 1表示是时间,而时间为秒,要转化为毫秒,*1000if(columnType == 1){return Long.parseLong(longValue) * 1000;}return Long.parseLong(longValue);}return null;}// 处理String类型字段public String evaluate(String column) {return getStringValue(column);}// 处理两个字段,比如xpoint 和 ypoing的转换,判空和拼接public String evaluate(String column1, String column2) {return convertLatLon(column1, column2);}/*** [@param](https://my.oschina.net/u/2303379) value* [@return](https://my.oschina.net/u/556800)* 获取string类型的字段,判空处理*/private String getStringValue(String value) {if (value != null && !"MULL".equalsIgnoreCase(value) && !"NULL".equalsIgnoreCase(value) && value.trim().length() != 0) {return value;}return null;}/*** @param lat* @param lon* @return* 将经度、维度拼接*/private String convertLatLon(String lat, String lon) {if (lat == null | lon == null || "MULL".equalsIgnoreCase(lat) || "MULL".equalsIgnoreCase(lon) || "NULL".equalsIgnoreCase(lat) || "NULL".equalsIgnoreCase(lon) || "0".equalsIgnoreCase(lat) || "0".equalsIgnoreCase(lon)) {return "0,0";}// 经纬度转换if (CommonUtils.parseDouble(lat) > CommonUtils.parseDouble(lon)) {return lon + "," + lat;} else {return lat + "," + lon;}}
}

3、利用map函数,将一条数据组装成Map,然后传递进来

/*** 读取hive的数据,然后将每条数据组合成一个json字符串,通过下面udf函数方法发送到kafka* <p>* 通过测试验证,Hive2KafkaUDF类在每次mr任务中,只会创建一次,所以producer可以做成单例** @Author liufu* @E-mail: 1151224929@qq.com* @CreateTime 2019/6/5  18:06*/
@Description(name = "hive2kafka", value = "_FUNC_(string, topic, map<string,string>) - Return ret ")
public class Hive2KafkaUDF extends UDF {private static Gson gson = new GsonBuilder().serializeNulls().create();private KafkaProducer<String, String> producer;public boolean evaluate(String kafkaParams, String topic, Map<String, String> dataMap) {KafkaProducer producerTemp = getProducer(kafkaParams);producerTemp.send(new ProducerRecord(topic, null, gson.toJson(dataMap)));return true;}private KafkaProducer getProducer(String kafkaParams) {if (producer == null) {synchronized ("getProducer") {if (producer == null) {Properties props = gson.fromJson(kafkaParams, Properties.class);producer = new KafkaProducer<>(props);}}}return producer;}
}
  • 3.2、 如何使用这个UDF

      利用map函数将数据组装成一个Map对象select hive2kafka("{'bootstrap.servers': 'gawh243:9092', 'acks': 'all', 'key.serializer': 'org.apache.kafka.common.serialization.StringSerializer', 'value.serializer': 'org.apache.kafka.common.serialization.StringSerializer'}", 'together001', // map函数,左边的name是最终的字段值,功能等同于username as namemap('name',username,'age',age)) from qwrenzixing.visual_deduction_kinship_relation
    

4、创建临时函数

  • 4.1、打包成jar包,可以放在任何能够访问到的地方,比如hdfs://,本地文件系统file://

  • 4.2、加载jar

      hive> add jar /root/hive2kafka.udf-1.0.jar;Added [/root/elasticsearce-hadoop/hive2kafka.udf-1.0.jar] to class pathAdded resources: [/root/elasticsearce-hadoop/hive2kafka.udf-1.0.jar]hive> create temporary function hive2kafka as 'com.study.Hive2KafkaUDF';hive> create temporary function allTracksudf as 'com.study.AllTracksUDF';或者直接使用远端jar来创建,不一定需要先add  jarhive> create temporary function hive2kafka as 'com.study.Hive2KafkaUDF' using jar 'hdfs://rsb:8082/udf/hive2es.udf-1.0.jar'
    

5、使用临时函数

  • 5.1、第一个函数

    select allTracksudf(create_time, 1L) as create_time from t_a;

  • 5.2、第二个函数

      利用map函数将数据组装成一个Map对象select hive2kafka("{'bootstrap.servers': 'gawh243:9092', 'acks': 'all', 'key.serializer': 'org.apache.kafka.common.serialization.StringSerializer', 'value.serializer': 'org.apache.kafka.common.serialization.StringSerializer'}", 'together001', // map函数,左边的name是最终的字段值,功能等同于username as namemap('name',username,'age',age)) from testDb.t_b;
    

转载于:https://my.oschina.net/liufukin/blog/798533

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程-单生产单消费模型

2019独角兽企业重金招聘Python工程师标准>>> 创建资源对象&#xff0c;提供保存和取出方法&#xff08;使用synchronized代码块实现&#xff09; /*** Created by shaoqinghua on 2018/5/3.* 定义一个负责保存和取出的资源类*/ public class Resource {/*** 定义成员…

github1s 油猴插件

github1s 是一个非常有趣的项目&#xff0c;它可以让你在 1 秒内&#xff08;俗称 1s&#xff09;通过在线版本的 VS Code 来打开 GitHub 上的代码&#xff0c;只需要在对应项目的 URL 后面加上 1s 即可。 这是一个很有创意、很赞的项目&#xff0c;只需要在对应的 GitHub 项目…

WPF-02 布局

WPF中布局控件继承Panel&#xff0c;可以实现非常复杂的布局。我们介绍一下常用的布局控件1. Grid 布局控件Grid是网格布局控件&#xff0c;在WPF开发中我们用的最多的一个布局控件&#xff0c;可以自定义行和列&#xff0c;分别设置Height和Witdh值&#xff0c;一般推荐通过比…

微信多开工具 可以同时在电脑上打开多个微信 免费开源

本程序用C#代码编写&#xff0c;运行环境FrameWork5.0以上。 主要代码&#xff1a; using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using Sys…

Linux 第十周学习笔记(2)smtp服务的部署

SMTP服务的部署介绍&#xff1a;SMTP(Simple Mail Transfer Protocol)简单邮件传输协议是一种提供可靠且有效电子邮件传输的协议。 SMTP 是建模在 FTP 文件传输服务上的一种邮件服务&#xff0c;主要用于传输系统之间的邮件信息并提供来信有关的通知。一&#xff0e;环境的部署…

关于CTeX的几个大坑

https://blog.csdn.net/zjutczj/article/details/53463478 最近一直忙着写小论文&#xff0c;毕业设计中期答辩&#xff0c;没有更新博客&#xff0c;忙过这一阵我会把这段时间学习机器学习的一些心得分享。今天分享几个刚刚使用CTeX遇到的大坑&#xff0c;希望能挽救一些还没有…

西安电子地图下载 来自谷歌电子地图库 地图展示15、17、19级

西安电子地图下载 来自谷歌电子地图库 地图展示15、17、19级 一般来说商业用图几乎相同就是17级左右&#xff0c;提供的下载全然满足大多数人浏览使用&#xff0c;假设用于旅行外出当然级数越高越好&#xff0c;假设是驴行&#xff0c;那就更有必要下载完整的地图以作不时之需。…

​Magicodes.Pay已支持Volo Abp

简介Magicodes.Pay希望打造一个统一支付库&#xff0c;相关库均使用.NET标准库编写&#xff0c;支持.NET Framework以及.NET Core。目前已提供Abp及Abp VNext模块的封装&#xff0c;支持开箱即用。主要功能目前已提供Abp&#xff08;含Abp VNext&#xff09;模块的封装&#xf…

vscode 头文件包含问题_WSL+VSCode = Linux ?

官方文档​code.visualstudio.com使用VSCode新推出的Remote功能来连接WSL或服务器进行开发. 可以在Windows上享受优秀的界面体验的同时使用Linux环境进行开发(还是要感谢无数的VSCode插件贡献者).环境基础配置Visual Studio Code最新版本注意点: 安装时需要勾选环境变量添加到p…

PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏

一&#xff1a;背景 C# 程序内存泄漏的诱发因素有很多&#xff0c;但从顶层原理上来说&#xff0c;就是该销毁的 用户根 对象没有被销毁&#xff0c;从而导致内存中意料之外的对象无限堆积&#xff0c;导致内存暴涨&#xff0c;最终崩溃&#xff0c;这其中的一个用户根就是 终结…

手机的小窗口怎么弄_荣耀9X如何设置桌面小工具?划重点,这个要考

为了方便手机操作&#xff0c;一些小伙伴会在手机桌面上添加天气、一键锁屏、日历等窗口小工具&#xff0c;那么问题来了&#xff01;荣耀9X这款新手机是如何添加窗口小工具呢&#xff1f;官维君今天就来给大家讲解一下方法。标准姿势看这里——第一步&#xff1a;在桌面双指头…

ASP.NET Core 同时支持多种认证方式 | Swagger 支持

前言上次&#xff0c;我们实现了《ASP.NET Core 同时支持多种认证方式》&#xff1a;services.AddAuthentication().AddDemoAuthentication(options > { }).AddJwtBearer(options >{...});我们还希望为 Swagger 也添加多种认证支持。原来为支持 JWT 认证&#xff0c;Swag…

Redis指南

一、简介 redis 和 memcached 都是高性能的键值缓存数据库服务&#xff0c;其中 memcached 支持多线程&#xff0c;而 redis 支持丰富的数据结构且能内置持久化机制。 redis 数据都是以键值形式存储的&#xff0c;键是字符串类型&#xff0c;值有 7 种类型&#xff08;本质上是…

SpringIOC之AbstractMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

【实战】手把手教你从 0 到 1 搭建一套 RocketMQ 集群

大家好&#xff0c;我是君哥。今天来分享怎样搭建 RocketMQ 集群。本文搭建集群使用的环境是 2 个云主机&#xff0c;架构如下&#xff1a;在 47.xx.xx.xx 和 39.xx.xx.xx 上分别部署一个 Name Server 和 Broker 主节点&#xff0c;这里不搭建从节点。也就是官网介绍的 2m-nosl…

敏捷制造:并不是你想像的矛盾体

\关键点\敏捷制造使企业能够比传统制造方式更快更有效地取悦客户 \敏捷方法实际上是为制造而不是软件而开发的 \敏捷制造需要从上到下的数字视角和承诺 \敏捷制造需要新的技能&#xff0c;还需要授权、扁平化合作和贯穿整个组织的沟通 \迈向敏捷制造的第一步可以是通过升级传统…

上海一趟,我陷入了沉思

hi&#xff0c;这里是桑小榆。2022年8月20日&#xff0c;我去了一趟上海&#xff0c;交了很多新朋友&#xff0c;和各行业且具备独立思考的伙伴交流了很多&#xff0c;也吸收了很多的新东西。此篇我将分享我的感悟&#xff0c;并以自己的角度剖析存在的问题。痛苦与症状在此之前…

Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件

为什么80%的码农都做不了架构师&#xff1f;>>> Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件 http://www.swiper.com.cn/ 转载于:https://my.oschina.net/huqiji/blog/800482

vue实现todo功能(一):搭建vue-webpack环境

前言 我最开始因为项目原因接触的是react&#xff0c;对于我这种美观狂而言&#xff0c;react中难以调解的css让我十分抓狂&#xff0c;说是在写页面&#xff0c;因为不能写自己的样式&#xff0c;像是在拼凑页面&#xff0c;没意思。于是我开始了解vue这种将css html javacrip…

单模光电转换器怎么接_以太网光纤收发器怎么用?

以太网光纤收发器有单模、多模&#xff0c;单纤、双纤&#xff0c;百兆、千兆&#xff0c;电信级和工业级品质&#xff0c;稳定可靠&#xff0c;是网络高清监控优选设备。那么&#xff0c;以太网光纤收发器怎么用呢&#xff1f;接下来就由飞畅科技的小编来为大家详细介绍下以太…