# 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倍。