hive添加UDF

步骤如下:
  • 函数分为永久和临时函数,后者会话退出则消失,前者不会

  • 查看已有函数(创建好后也可以通过这个来查看是否成功

  1. show functions;
  • 写UDF的java文件,如:
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. package org.apache.hadoop.hive.ql.udf;
  19. import org.apache.hadoop.hive.ql.exec.UDF;
  20. import org.apache.hadoop.hive.serde2.ByteStream;
  21. import org.apache.hadoop.hive.serde2.io.ByteWritable;
  22. import org.apache.hadoop.hive.serde2.io.DoubleWritable;
  23. import org.apache.hadoop.hive.serde2.io.ShortWritable;
  24. import org.apache.hadoop.hive.serde2.io.TimestampWritable;
  25. import org.apache.hadoop.hive.serde2.lazy.LazyInteger;
  26. import org.apache.hadoop.hive.serde2.lazy.LazyLong;
  27. import org.apache.hadoop.io.BooleanWritable;
  28. import org.apache.hadoop.io.BytesWritable;
  29. import org.apache.hadoop.io.FloatWritable;
  30. import org.apache.hadoop.io.IntWritable;
  31. import org.apache.hadoop.io.LongWritable;
  32. import org.apache.hadoop.io.NullWritable;
  33. import org.apache.hadoop.io.Text;
  34. /**
  35. * UDFToString.
  36. *
  37. */
  38. public class UDFToString extends UDF {
  39. private final Text t = new Text();
  40. private final ByteStream.Output out = new ByteStream.Output();
  41. public UDFToString() {
  42. }
  43. public Text evaluate(NullWritable i) {
  44. return null;
  45. }
  46. private final byte[] trueBytes = {'T', 'R', 'U', 'E'};
  47. private final byte[] falseBytes = {'F', 'A', 'L', 'S', 'E'};
  48. public Text evaluate(BooleanWritable i) {
  49. if (i == null) {
  50. return null;
  51. } else {
  52. t.clear();
  53. t.set(i.get() ? trueBytes : falseBytes);
  54. return t;
  55. }
  56. }
  57. public Text evaluate(ByteWritable i) {
  58. if (i == null) {
  59. return null;
  60. } else {
  61. out.reset();
  62. LazyInteger.writeUTF8NoException(out, i.get());
  63. t.set(out.getData(), 0, out.getCount());
  64. return t;
  65. }
  66. }
  67. public Text evaluate(ShortWritable i) {
  68. if (i == null) {
  69. return null;
  70. } else {
  71. out.reset();
  72. LazyInteger.writeUTF8NoException(out, i.get());
  73. t.set(out.getData(), 0, out.getCount());
  74. return t;
  75. }
  76. }
  77. public Text evaluate(IntWritable i) {
  78. if (i == null) {
  79. return null;
  80. } else {
  81. out.reset();
  82. LazyInteger.writeUTF8NoException(out, i.get());
  83. t.set(out.getData(), 0, out.getCount());
  84. return t;
  85. }
  86. }
  87. public Text evaluate(LongWritable i) {
  88. if (i == null) {
  89. return null;
  90. } else {
  91. out.reset();
  92. LazyLong.writeUTF8NoException(out, i.get());
  93. t.set(out.getData(), 0, out.getCount());
  94. return t;
  95. }
  96. }
  97. public Text evaluate(FloatWritable i) {
  98. if (i == null) {
  99. return null;
  100. } else {
  101. t.set(i.toString());
  102. return t;
  103. }
  104. }
  105. public Text evaluate(DoubleWritable i) {
  106. if (i == null) {
  107. return null;
  108. } else {
  109. t.set(i.toString());
  110. return t;
  111. }
  112. }
  113. public Text evaluate(Text i) {
  114. if (i == null) {
  115. return null;
  116. }
  117. i.set(i.toString());
  118. return i;
  119. }
  120. public Text evaluate(TimestampWritable i) {
  121. if (i == null) {
  122. return null;
  123. } else {
  124. t.set(i.toString());
  125. return t;
  126. }
  127. }
  128. public Text evaluate (BytesWritable bw) {
  129. if (null == bw) {
  130. return null;
  131. }
  132. t.set(bw.getBytes(),0,bw.getLength());
  133. return t;
  134. }
  135. }
  • 将写好的java文件打包成jar:
  1. jar cvf UDFUpper.jar -c bin UDFUpper.java
  • 进入hive,添加jar文件
  1. hive> add jar UDFToString.jar;
  2. Added [UDFToString.jar] to class path
  3. Added resources: [UDFToString.jar]
  • 添加临时函数(会话结束函数消失

    • 进入hive,添加jar文件

      1. hive> add jar UDFToString.jar;
      2. Added [UDFToString.jar] to class path
      3. Added resources: [UDFToString.jar]
    • 添加函数(注意class所在包)

      1. 语法为:
      2. CREATE TEMPORARY FUNCTION function_name AS class_name;
      3. hive> create temporary function mytest as 'org.apache.hadoop.hive.ql.udf.UDFToString';
      4. OK
      5. Time taken: 0.009 seconds
      6. 路径出错会提示:
      7. FAILED: Class default.udf.Upper not found
      8. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask
      9. 具体类路径为UDF java文件里的package+'.'+java文件名
    • 删除临时函数

      1. DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
  • 添加永久函数

    • 添加

      1. 语法:
      2. CREATE FUNCTION [db_name.]function_name AS class_name
      3. [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
      4. 注意:
      5. 如果hive非本地模式运行,则后面应该是为非本地文件等URI,如hdfs路径,否则会报错;
      6. 例子:
      7. hive> create function default.hah as "org.apache.hadoop.hive.ql.udf.UDFToString" using jar "UDFToString.jar";
      8. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask. Hive warehouse is non-local, but UDFToString.jar specifies file on local filesystem. Resources on non-local warehouse should specify a non-local scheme/path
      9. hive> create function default.hah as "org.apache.hadoop.hive.ql.udf.UDFToString" using jar "hdfs:///hdfs_home/UDFToString.jar";
      10. converting to local hdfs:///hdfs_home/UDFToString.jar
      11. Added [/tmp/fda83e6d-e1af-4005-affa-9f9c4ee226a6_resources/UDFToString.jar] to class path
      12. Added resources: [hdfs:///hdfs_home/UDFToString.jar]
      13. OK
      14. Time taken: 0.521 seconds
    • 删除

      1. DROP FUNCTION [IF EXISTS] function_name;
引用第三方包的情况

假如在你的UDF文件里引用了第三方包,那么只需要在生成jar文件的时候改变一下命令就可以了,如下:

  1. javac -classpath hive-0.4.1.jar:commons-io-2.5.jar:bcprov-jdk15on-158.jar com/example/hive/udf/UDFDecrypt.java
  2. jar -cvf UDFDecrypt.jar ./com/example/hive/udf/UDFDecrypt.class
  3. 上面javac命令中classpath跟的是用到的第三方包名,使用:做间隔,后面跟的是java文件路径

此处参考了这里

参考

hive添加UDF的更多相关文章

  1. hive 添加UDF(user define function) hive的insert语句

    add JAR /home/hadoop/study/study2/utf.jar; package my.bigdata.udf; import org.apache.hadoop.hive.ql. ...

  2. Hive 10、Hive的UDF、UDAF、UDTF

    Hive自定义函数包括三种UDF.UDAF.UDTF UDF(User-Defined-Function) 一进一出 UDAF(User- Defined Aggregation Funcation) ...

  3. hive中UDF、UDAF和UDTF使用

    Hive进行UDF开发十分简单,此处所说UDF为Temporary的function,所以需要hive版本在0.4.0以上才可以. 一.背景:Hive是基于Hadoop中的MapReduce,提供HQ ...

  4. hive下UDF函数的使用

    1.编写函数 [java] view plaincopyprint?package com.example.hive.udf;    import org.apache.hadoop.hive.ql. ...

  5. 在hive中UDF和UDAF使用说明

    Hive进行UDF开发十分简单,此处所说UDF为Temporary的function,所以需要hive版本在0.4.0以上才可以. 一.背景:Hive是基于Hadoop中的MapReduce,提供HQ ...

  6. 【转】hive中UDF、UDAF和UDTF使用

    原博文出自于: http://blog.csdn.net/liuj2511981/article/details/8523084 感谢! Hive进行UDF开发十分简单,此处所说UDF为Tempora ...

  7. hive的UDF读取配置文件

    hive的UDF读取配置文件 实现步骤 在读取配置文件的写为./file_name,然后在添加UDF的时候把配置文件也加入资源就好了: add jar xxx.jar; add file file_n ...

  8. 【Hive五】Hive函数UDF

    Hive函数 系统自带的函数 查看系统自带的函数 查看系统自带的函数 show functions; 显示自带的函数的用法 desc function upper; 详细显示自带的函数的用法 desc ...

  9. hive premanent udf 发布...

    起因: hive premanent udf 发布成功,但是hue 无法加载使用(但是cli 是可用的) ,处理半天,依然不可用!后来发现重启hiveserver2 就可以了     具体步骤如下:  ...

随机推荐

  1. 听听各位对Ubuntu的UI的看法

    2012-7-15 15:46    最近升级到Ubuntu 12.4 .发现其界面效果真的时越来越炫啦.我就在想,你Ubuntu你图什么啊, 你是以个Linux系统,你的重点在于让系统运行更稳定,更 ...

  2. 对Java的常用对象(POJO、DTO、PO、BO、VO、DAO)详细解释及应用场景

    首先这些对象都应用都是一些单词的简称,也是一种应用思想,故其他语言也可以使用,在Java里比较常见这些对象吧.下面来一一解释. 一.POJO(Plain Ordinary Java Object). ...

  3. sql server @@ROWCOUNT 会被 if 给 清 0

    官方说 @@ROWCOUNT  会被以下几种语句清0 原文如下: Statements such as USE, SET <option>, DEALLOCATE CURSOR, CLOS ...

  4. 双链表实现Queue

    算法导论第10章的东西,感觉用双链表真心简单,就是有点浪费空间,但是时间复杂度O(1): #include <stdio.h> struct LinkNode { LinkNode(): ...

  5. 简单解决XP共享连接数10限制(转)

    1.建立一个txt文件,在里面输入以下文字:net session /delete /y,并将其保存为clear session.bat文件.net session用于查看本机共享的会话详细情况,可以 ...

  6. System.net.mail 腾讯ssl发送邮件超时

    我采用了.net 的自带组件 System.Web.Mail.MailMessage发送邮件,主要是在客户注册网站成功的时候发条欢迎邮件,最近邮件无法发送了,看了下腾讯smtp邮件配置,所有的邮件发送 ...

  7. MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种

    1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...

  8. top 学习

    通常top命令是会持续运行而不终止的. 要在脚本里用,需要添加一些选项参数,尤其是-b.例如:top -b -n 2 -d 3 >/tmp/log -b表示批处理模式(Batch mode),以 ...

  9. 构建你的长寿命的API第1部分:规范驱动的API开发

    构建你的长寿命的API第1部分:规范驱动的API开发 这篇文章是由MuleSoft的Mike Stowe在nginx.conf 2016公布的演示文稿改编的.第一部分重点是规范驱动的API开发. 第二 ...

  10. asp.net中C#中计算时间差代码

    我用的最简单的办法是 代码如下 复制代码 DateTime dtone = Convert.ToDateTime("2007-1-1 05:32:22");DateTime dtw ...