你要写的查询有事无法轻松或是(无法完成)的查询任务,使用Hive内置函数来标识。
通过编写用户自定义函数(user-defind function,UDF),Hive可以方便地插入用户写的处理代码并在查询中调用他们。
UDF支持的编程语言:Java(只支持Java)
Hive本身也是Java编写的。对于其他编程语言,可以考虑使用SELECT TRANSFORM 查询,
有了它,可以让数据流经用户自定义的脚本。
Hive中有三种UDF:(普通)UDF、用户定义聚集函数(user-defind aggregate function,UDAF)
以及用户自定义表生成函数(user-defind generating function,UDTF)。
自定义UDF函数 去除字符串尾字符的UDF:
package com.ht.hive;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
/**
* Created by MAIBENBEN on 2018/7/5.
*/
public class Stripextends UDF {
public static void main(String[] args) {
Strip hive =new Strip();
Text evaluate = hive.evaluate(new Text("asd"),"sd");
System.out.println(evaluate.toString());
}
private Textresult =new Text();
public Text evaluate(Text str) {
if (null == str) {
return null;
}
result.set(StringUtils.strip(str.toString()));
return result;
}
public Text evaluate(Text str, String stripChars) {
if (null == str) {
return null;
}
result.set(StringUtils.strip(str.toString(), stripChars));
return result;
}
}
一个UDF函数必须满足下面两个条件:
1、一个UDF必须是 org.apache.hadoop.hive.ql.exec.UDF 的子类
2、 一个必须;至少实现了evaluate() 方法
evaluate方法不是接口定义的,Hive会检查UDF,看是否能找到相匹配的evaluate方法。
计算一组整数中最大的UDAF
package com.ht.hive;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.io.IntWritable;
/**
* Created by MAIBENBEN on 2018/7/6.
*/
public class Maximumextends UDAF {
public static class MaximumIntUDAFEaluatorimplements UDAFEvaluator {
private IntWritableresult;
@Override
public void init() {
result =null;
}
public boolean iterate(IntWritable value) {
if (null == value) {
return true;
}else {
result.set(Math.max(result.get(), value.get()));
}
return true;
}
public IntWritable terminatePartial() {
return result;
}
public boolean merge(IntWritable other) {
return iterate(other);
}
public IntWritable terminate() {
return result;
}
}
}
一个UDAF函数必须满足以下条件条件:
一个UDAF必须是 org.apache.hadoop.hive.ql.exec.UDAF 的子类,并且包含一个或多个嵌套
的、实现了 org.apache.hadoop.hive.ql.exec.UDAFEvaluator 的静态类。