# impala-udf
**Repository Path**: fangzhimeng0/impala-udf
## Basic Information
- **Project Name**: impala-udf
- **Description**: impala自定义函数
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2020-03-19
- **Last Updated**: 2020-12-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Impala自定义函数创建语法:
CREATE FUNCTION [IF NOT EXISTS] [db_name.]function_name[(arg_type[arg_type…])]
[returns return_type]
LOCATION 'hdfs_path_to_jar'
SYMBOL='class_name'
LOCATION:实现该函数的jar包所在的HDFS路径。
SYMBOL:该函数实现的全类名,可通过 jar tf jar_file命令来查看获取。
使用java编写impala自定义函数实现
遵循规则:
1:入参和出参必须是Impala支持的标准数据类型,不能是复杂对象或嵌套类型;
2:当前不支持接受和返回TIMESTEMP时间戳类型;
3:受限于我们公司使用的Impala版本,函数声明暂不支持返回Java基本类型(int、String……),而必须是其相对应的”Writable”封装类型(IntWritable、Text……)。注:公司目前在用的版本是CDH 5.5.1 / Impala 2.3.0。
常用类型对照
Java Impala Data Type Writable
Int INT IntWritable
Long LONG LongWritable
float FLOAT FloatWritable
double DOUBLE DoubleWritable
boolean BOOLEAN BooleanWritable
String STRING TEXT
Maven依赖
org.apache.hadoop
hadoop-common
${hadoop.version}
org.apache.hive
hive-exec
${hive.version}
依赖包的版本选择的最佳实践是根据对应的服务部署版本来选择,目前我们公司选择的开发版本为:
Hadoop.version = 2.6.0-cdh5.5.1
Hive.version = 1.1.0-cdh5.5.1
函数实现
创建一个继承 org.apache.hadoop.hive.ql.exec.UDF 的类,其中包含一个或多个名为 evaluate 的方法(可重载)。
package com.cloudera;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
}
}
至此函数实现即编写完成,将其编译打包成jar文件,并上传至hdfs。
>hadoop fs -mkdir /demo
>hadoop fs -put demo-1.0.0.jar /demo
函数声明
create function if not exists edecathlon.lower(string)
returns string
location '/demo/demo-1.0.0.jar'
symbol 'com.cloudera.Lower';
注意:
1:在impala自定义函数申明中,当symbol指定的函数实现类中有且只有一个evaluate方法时,函数申明中的入参类型和返回值类型是可以不指定的;但当一个实现类中包含多个evaluate重载方法时则必须明确指定函数的入参类型和返回值类型。
2:服务重启会导致impala自定义函数丢失, cloudera官网宣称其于CDH 5.7 / Impala 2.5 版本中解决了该问题。目前我们的解决方案是编写crontab定时脚本来检查函数是否丢失,丢失则重建。
3:考虑使用C++来编写impala UDF的实现,同等函数C++编写的运行效率要比Java编写的快10倍。