hive自定义函数,这里我们举一个简单的小例子来进行学习。
下面是在eclipse中自定义的方法 TimeFormatUDF
方法目的是为了,把log日志中时间格式为[29/April/2016:17:38:20 +0800] 改为yyyy-MM-dd HH:mm:ss。
//自定义函数需要继承UDF类,还需要添加 hive-exec 的依赖
public class TimeFormatUDF extends UDF {
public static final SimpleDateFormat DATE_FORMAT =
new SimpleDateFormat("[dd/MMMMM/yyyy:HH:mm:ss Z]",Locale.ENGLISH);
public static final SimpleDateFormat STAND_DATE_FORMAT =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//evaluate这个方法明需要和官方文档一致,否则程序会运行错误
public String evaluate(String time) {
try {
Date oDate = DATE_FORMAT.parse(time);
return STAND_DATE_FORMAT.format(oDate);
} catch (Exception e) {
return null;
}
}
public String evaluate(String time, String type) {
try {
Date oDate = DATE_FORMAT.parse(time);
if (type != null && type.equals("hour")) {
SimpleDateFormat sdf = new SimpleDateFormat("HH");
return sdf.format(oDate);
} else if (type.equals("year")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
return sdf.format(oDate);
} else if (type.equals("month")) {
SimpleDateFormat sdf = new SimpleDateFormat("MM");
return sdf.format(oDate);
} else if (type.equals("day")) {
SimpleDateFormat sdf = new SimpleDateFormat("dd");
return sdf.format(oDate);
} else {
return null;
}
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) {
TimeFormatUDF test = new TimeFormatUDF();
//把log日志中时间格式为[29/April/2016:17:38:20 +0800] 改为yyyy-MM-dd HH:mm:ss
String evaluate = test.evaluate("[29/April/2016:17:38:20 +0800]");
System.out.println(evaluate);
}
}
我们需要把java代码打包成jar包上传到虚拟机上,
这是在hive中运行的hql语句。
--统计每个时段的pu和uv数量;
--如果程序代码出现错误,需要把上传的jar包删除,再重新添加
delete jar /usr/jar/timeformat.jar;
--添加打包为jar的应用程序
add jar /usr/jar/timeformat.jar;
--创建自定义函数
create function str_to_date as 'com.wahaha.hiveudf.TimeFormatUDF';
show functions;
--time为数据库表中的字段
select str_to_date(time,'hour') from apachelog;
好了,这样就ok了,这么简单的小例子,希望能成为你学习hive自定义函数的小起点。