在Hive中已经为我们提供了部分函数
但是在生产实践当中,这些还远远不够,我们可以通过Hive官网提供的方法https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateFunction,来创建自定义函数。
但在这里,我们介绍另外一种较为繁琐的方法,将UDF整合到hive源码,并对hive源码进行编译,使得我们的函数和hive自带的函数一样,打开hive便可以使用
1.开发UDF
pom部分依赖如下:
<hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
<hive.version>1.1.0-cdh5.7.0</hive.version>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
我的UDF如下:
HelloUDF.java
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
@Description(name = "HelloUDF,
value = "_FUNC_(input_str) - returns Hello : input_str ",
extended = "Example:\n "
+ " > SELECT _FUNC_('moyuan') FROM src LIMIT 1;\n"
+ " 'Hello : moyuan'\n")
public class HelloUDF extends UDF {
public Text evaluate( Text input){
return new Text("Hello: "+input);
}
}
2.下载hive源码包并解压
hive 源码可在http://archive.cloudera.com/cdh5/cdh/5/自行下载
[hadoop@hadoop software]$ tar -zxvf hive-1.1.0-cdh5.7.0-src.tar.gz -C ../source/
[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ pwd
/home/hadoop/source/hive-1.1.0-cdh5.7.0
3.对hive源码包进行变动
1.将HelloUDF.java移动至/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf文件夹下
2.修改HelloUDF.java,将package目录改为package org.apache.hadoop.hive.ql.udf;
3.修改/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
引入我们的UDF
import org.apache.hadoop.hive.ql.udf.HelloUDF;
static {
system.registerGenericUDF("concat", GenericUDFConcat.class);
system.registerUDF("HelloUDF", HelloUDF.class, false);
system.registerUDF("substr", UDFSubstr.class, false);
...}
4.对hive源码进行编译
[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ mvn clean package -DskipTests -Phadoop-2 -Pdist
等待之后
此时要用我们的UDF,可以采用两种方式
1.用我们编译好的hive,重新部署
2.将/home/hadoop/source/hive-1.1.0-cdh5.7.0/packaging/target 中hive目录下的lib中的hive-exec-1.1.0-cdh5.7.0.jar替换到我们现在用的$HIVE_HOME/lib下即可
来看我们到底成功没有
hive> show functions;
hive> select helloudf("moyuan") from dual;
OK
Hello: moyuan
Time taken: 0.056 seconds, Fetched: 1 row(s)
hive>
成功!