整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

12.8.1 写 UDF

hadoop 小红牛 8℃ 0评论

为了演示如何写和使用UDF,我们将写一个简单的剪除字符串尾字符的 UDF。Hive已经有一个内置的名为trim的函数,所以我们把自己的函数 称为strip。Strip Java类的代码如范例12-3所示。

范例12-3.剪除字符串尾字符的UDF

package com.hadoopbook.hive;
 
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.io.Text;
public class Strip extends UDF { 
    private Text result = new Text();
    
    public Text evaluate(Text str) { 
        if (str == null) { 
            return null;
        }
        result.set(StringUtiIs.strip(str.toString()));
        return result;
    }
    public Text evaluate(Text str, String stripChars) {
        if (str == null) {
        return null;
        }
    result.set(StringUtils.strip(str.toString()^ stripChars));
    return result;
    }
}

一个UDF必须满足下面两个条件:

•一个 UDF 必须是 org. apache . hadoop. hive. ql. exec.UDF 的子类

•一个UDF必须至少实现了 evaluate()方法

evaluate()方法不是由接口定义的,因为它可接受的参数的个数、它们的 数据类型及其返回值的数据类型都是不确定的。Hive会检査UDF,看能否 找到和函数调用相匹配的evaluate()方法。

这个Strip类有两个evaluate。方法。第一个方法去除输入的前导和结
束的空白字符;而第二个方法则去除字符串尾出现在指定字符集合中的任 何字符。实际的字符处理工作交由Apache Commons项目里的
StringUtils类来完成。所以代码中唯一值得一提的是对Hadoop Writable
库中Text的使用。实际上,Hive支持在UDF中使用Java的基本类型(以
及其他一些像java.util.List和;java.util.Map这样的类型),所以,
下面这样函数签名(signature)的效果是一样的:

public String evaluate(String str)

但是,通过使用Text,我们可以利用对象重用的优势,增效节支。因此一 般推荐使用这种方法。

为了在Hive中使用UDF,我们需要把编译后的Java类打包(package)成一 个JAR文件(可以用本书所附代码输入ant hive来完成),并在Hive中注 册这个文件:

ADD JAR /path/to/hive-examples.jar;

我们还需要为Java的类名起一个別名:

CREATE TEMPORARY FUNCTION strip AS’ com.hadoopbook.hive.Strip’;

这里的TEMPORARY关键字强调了这样的事实:UDF只是为这个Hive会话
过程定义的(它们并没有在metastore中持久化存储)。事实上,这意味着你
需要在每个脚本的最前面添加JAR文件或定义函数,或者在主目录创建包 含这些命令的.hiverc文件,以使得这些UDF会在每个Hive会话开始时
运行。

要想在开始时调用ADD JAR,还可以在Hive启动时指定査找附加 JAR文件的路径,这个路径会被加入Hive的类路径(也包括 MapReduce的类路径)。这种技术对于毎次运行Hive时自动添加你 的UDF库是很有用的。

有两种指明路径的办法:在hive命令后传递–auxpath选项:

% hive --auxpath /path/to/hive-examples.jar

或在运行Hive前设置HIVE_AUX_]ARS_PATH环境变量。附加路径可以是一个用逗号分隔的MR文件路径列表或包含JAR文件的 目录。

现在像使用内置函数一样使用UDF:

hive> SELECT strip('bee') FROM dummy; 
bee
hive〉 SELECT strip('banana', ’ab') FROM dummy; 
nan
注意,UDF名不是大小写敏感的:
hive> SELECT STRIP('bee') FROM dummy;
bee

转载请注明:全栈大数据 » 12.8.1 写 UDF

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址