一.UDF的描述
用户自定义函数(UDF)是一个允许用户扩展HiveQL的强大的功能。用户可以使用Java编写自己的UDF,一旦将用户自定义函数加入到用户会话中(交互式的或者通过脚本执行的),它们就将和内置的函数一样使用,甚至可以提供联机帮助。Hive具有多种类型的用户自定义函数,每一种都会针对输入数据执行特定“一类”的转换过程。
在ETL处理中,ETL(是指:ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。) 一个处理过程可能包含多个处理步骤。Hive语言具有多种方式来将上一步骤的输入通过管道传递给下一个步骤,然后在一个查询中产生众多输出。用户同样可以针对一些特定的处理过程编写自定义函数。如果没有这个功能,那么一个处理过程可能就需要包含一个MapReduce步骤或者需要将数据转移到另一个系统中来实现这些改变。因此,Hive提供了用户自定义函数(UDF),UDF是在Hive查询产生的相同的task进程中执行的,因此它们可以高效地执行。
自定函数包括UDF:User-Defined Functions 一对一:一个参数一个返回 substring,格式化
UDAF(User Defined Aggregate Function) 多对一:个参数,一个返回 max,avg
UDTF:Table-Generating Functions 一对多:一个参数,多个返回 数据解析
二.自定义UDF函数的程序-----实现统计
时间格式化以及取出双引号的代码:
问题的描述:
- 数据格式
"27.38.5.159" "31/Aug/2015:00:04:37 +0800"
ip: IP地址 datetime_str: 访问时间
- 写两个UDF
- 去除 字段的双引号
- 转换日期时间格式
20150830000437
- 查询结果:
SELECT
removeQuato(ip) AS ip,
transforDate(datetime_str) AS date_str
FROM
access_log LIMIT 5 ;
27.38.5.159, 20150830000437
下面是实现去除双引号的代码:
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class removeQuato extends UDF {
public Text evaluate(Text text){
String value = text.toString();
if(StringUtils.isBlank(value)) {
return null;
}else{
text.set(value.replaceAll("\"",""));
}
return text;
}
public static void main(String[] args) {
Text test = new Text("\"27.38.5.159\"");
System.out.println(new removeQuato().evaluate(test));
}
}
下面是时间格式化的代码:
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.parse.ParseException;
import org.apache.hadoop.io.Text;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class transforDate extends UDF{
public Text evaluate(Text text) throws ParseException, java.text.ParseException {
SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z", Locale.ENGLISH);
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String value = text.toString();
String str = value.replaceAll("\"", "");
// 过滤
if(StringUtils.isBlank(value)) {
return null;
}
// parse
Date parseDate = inputFormat.parse(str);
// format
String outputDate = outputFormat.format(parseDate);
text.set(outputDate);
return text;
}
public static void main(String[] args) throws ParseException, java.text.ParseException {
Text test = new Text("\"31/Aug/2015:00:04:37 +0800\"");
System.out.println(new transforDate().evaluate(test));
}
}
以上就是关于UDF以及去除双引号以及时间格式化的代码以及描述。