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

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

5、Hive的自定义UDF函数相关推荐

  1. hive编写自定义UDF函数

    需求:hive表email_status_result中有个邮箱(receiver )字段,查询结果需要脱敏展示,表结构如下 CREATE TABLE email_status_result( rec ...

  2. HIVE自定义UDF函数-经纬度转换成省市地址

    目录 1.需求背景 2.解决方案 3.代码pom引用 4.代码集成UDF 5.编译jar包 6.使用说明 7.将jar包放到hdfs 8.创建持久化function 9.测试 10.结语 1.需求背景 ...

  3. Hive _函数(系统内置函数、自定义函数、自定义UDF函数)

    函数 系统内置函数 1.查看系统自带的函数 show functuions; 2.显示自带的函数的用法 desc function month; 3.详细显示自带的函数的用法 desc functio ...

  4. java调mongodb自定义函数,自定义UDF函数,从hive保存到mongodb

    (可以通过idea工具调试UDF函数,第二步中会提供参考) 一.自定义UDF函数: 1.首先是pom.xml文件 xmlns:xsi="http://www.w3.org/2001/XMLS ...

  5. hive 转拼音udf_自定义UDF函数:将汉字转换成拼音

    工作需求要讲汉字转换成拼音,自定义UDF函数 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j ...

  6. 8.Hive基础—函数—系统内置函数、常用内置函数、自定义函数、自定义UDF函数、自定义UDTF函数

    本文目录如下: 第8章 函数 8.1 系统内置函数 8.2 常用内置函数 8.2.1 空字段赋值 8.2.2 CASE WHEN THEN ELSE END 8.2.3 行转列 8.2.4 列转行 8 ...

  7. 自定义UDF函数:将汉字转换成拼音

    工作需求要讲汉字转换成拼音,自定义UDF函数 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j ...

  8. 自定义UDF函数和UDTF函数

    文章目录 1.创建maven项目,引入依赖 2.自定义函数 自定义UDF函数 自定义UDTF函数 hive调用jar包创造函数 方法1:上传到linux下导入hive 方法2:上传到hdfs上再导入h ...

  9. sprk sql自定义UDF函数

    1 自定义UDF函数与scala定义函数的方式是一样的(也可以定义方法,调用的时候转换为函数即可) 2 自定义的函数需要注册后才能使用,注册的方式为 session.udf.register(自定义名 ...

最新文章

  1. vs code配置python环境mac_mac vscode Python配置
  2. 17. Letter Combinations of a Phone Number
  3. PhpStorm设置
  4. Android和IOS打开文档
  5. 启用密码管理之前创建的用户连接Oracle报ORA-28002处理一则
  6. Node.js学习之路24——Express框架的app对象
  7. 【Go】panic: reflect: call of reflect.Value.FieldByName on ptr Value
  8. oracle truncate 日期,【Oracle】truncate和delete区别
  9. 集福宝 支付宝2021年最新一款集福神器
  10. c++ ea 代码 生成_看EA如何生成代码框架
  11. JAVA程序设计:接受数字并求和
  12. Eclipse在选项卡上展示某个具体的视图
  13. linux ldd命令详解
  14. 信息系统项目管理重点:供应链管理(SCM)
  15. 路由器刷机突破校园网限制
  16. Word论文排版之样式的使用
  17. 谈谈成功,你离成功有多远?施瓦辛格励志演讲分享(配中文翻译)
  18. ionic5 ion-refresher下拉更新
  19. 电脑系统坏了怎么修复
  20. 大数据+物联网智能交通系统

热门文章

  1. js获取单选按钮的值
  2. Linux运行级详解
  3. 补发《超级迷宫》站立会议三
  4. OEA 框架中集成的 RDLC 报表介绍
  5. 评上了7月份的Microsoft MVP
  6. Java多线程复习_Java多线程复习
  7. Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)
  8. 全国计算机等级考试题库二级C操作题100套(第81套)
  9. python爬虫获取小说根据正文调用函数传入章节地址列表_python爬虫之小说章节获取,聊斋志异小说完整版...
  10. python抽象类的实现_python 抽象类、抽象方法的实现