我爱编程

Hive自定义UDF函数

2018-07-25  本文已影响0人  IT_小白

你要写的查询有事无法轻松或是(无法完成)的查询任务,使用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 的静态类。

上一篇下一篇

猜你喜欢

热点阅读