开发Impala用户自定义函数
当Impala的内置函数不能满足需要时,可以通过编写用户自定义函数UDF(User-Defined Functions)插入自己的处理代码并在查询中使用它们。
按实现方式,UDF有如下分类:
- 普通的UDF,用于操作单个数据行,且产生一个数据行作为输出。
- 用户定义聚集函数UDAF(User-Defined Aggregating Functions),用于接受多个输入数据行,并产生一个输出数据行。
- 用户定义表生成函数UDTF(User-Defined Table-Generating Functions),用于操作单个输入行,产生多个输出行。Impala不支持该类UDF。
按使用方法,UDF有如下分类:
- 临时函数,只能在当前会话使用,重启会话后需要重新创建。
- 永久函数,可以在多个会话中使用,不需要每次创建。
Impala支持开发Java UDF,也可以复用Hive开发的UDFs,前提是使用Impala支持的数据类型。Impala支持的数据类型请参考http://impala.apache.org/docs/build3x/html/topics/impala_datatypes.html。
此外,Impala还支持C++编写的UDF,性能上比Java UDF更好。
使用示例
以下为复用lower()函数的示例。
[localhost:21000] > create database udfs; [localhost:21000] > use udfs; [localhost:21000] > create function my_lower(string) returns string location '/user/hive/udfs/hive.jar' symbol='org.apache.hadoop.hive.ql.udf.UDFLower'; [localhost:21000] > select my_lower('Some String NOT ALREADY LOWERCASE'); +----------------------------------------------------+ | udfs.my_lower('some string not already lowercase') | +----------------------------------------------------+ | some string not already lowercase | +----------------------------------------------------+ Returned 1 row(s) in 0.11s [localhost:21000] > create table t2 (s string); [localhost:21000] > insert into t2 values ('lower'),('UPPER'),('Init cap'),('CamelCase'); Inserted 4 rows in 2.28s [localhost:21000] > select * from t2; +-----------+ | s | +-----------+ | lower | | UPPER | | Init cap | | CamelCase | +-----------+ Returned 4 row(s) in 0.47s [localhost:21000] > select my_lower(s) from t2; +------------------+ | udfs.my_lower(s) | +------------------+ | lower | | upper | | init cap | | camelcase | +------------------+ Returned 4 row(s) in 0.54s