Hive自定义函数
来源:互联网 发布:日系男装 知乎 编辑:程序博客网 时间:2024/06/18 13:20
Hive自定义函数
1 UDF
用户自定义函数(user defined function)针对单条记录。
1.1 创建函数流程
- 添加pom依赖
- 自定义一个java类
- 继承UDF类
- 重写evaluate方法
- 打成jar包
- 在hive中执行add jar方法
- 在hive执行创建模板函数
1.2 实例一
第一步、添加依赖
<?xml version="1.0" encoding="UTF-8"?> <dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> </dependencies></project>
第二步、自定义java类
package udfdemo;import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.io.Text;public class UDFTest extends UDF{ public int evaluate(int a,int b){ return a + b; } public int evaluate(int a, int b, int c){ return a + b + c; }}
第三步、打成jar包
第四步、在hive客户端中执行add jar方法
第五步、在hive创建的函数,引入的类是UDF.UDFTest
hive>add jar /home/centos/UDFTest.jar// 创建临时函数hive>create temporary function add as 'UDFDemo.UDFTest';
第六步、调用
hive>select add(1,2);hvie>select add(1,2,3);
1.3 实例二(自定义处理时间戳函数)
添加pom文件 略。。。
时间处理工具类
package dateutil;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class DateUtil{ /** * 得到指定日期的起始时刻 */ public static long getDayBegin(Date date, int offset){ try{ // 日历类 Calendar c = Calendar.getInstance() ; c.setTime(date) ; // 时间增减 c.add(Calendar.DAY_OF_MONTH,offset) ; Date newDate = c.getTime() ; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM//dd 00:00:00"); return sdf.parse(sdf.format(newDate)).getTime(); }catch(Exception e){ e.printStackTrace(); } return -1 ; } /** * 得到指定日期所在月份的月初零点时刻(即所在月的1号的零点) */ public static long getMonthBegin(Date date, int offset){ try{ // 日历类 Calendar c = Calendar.getInstance() ; c.setTime(date) ; c.add(Calendar.MONTH, offset) ; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/01 00:00:00") ; String ymd = sdf.format(c.getTime()); return sdf.parse(ymd).getTime(); }catch(Exception e){ e.printStackTrace(); } return -1 ; } /** * 得到制定日期的所在周的周日的零时刻 */ public static long getWeekBegin(Date date, int offset){ try{ Calendar c = Calendar.getInstance() ; c.setTime(date) ; int n = c.get(Calendar.DAY_OF_WEEK) ; c.add(Calendar.DAY_OF_MONTH, -(n-1)); c.add(Calendar.DAY_OF_MONTH, offset * 7) ; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd 00:00:00"); String ymd = sdf.format(c.getTime()); return sdf.parse(ymd).getTime(); }catch(Exception e){ e.printStackTrace() ; } return -1 ; }}
自定义函数,获取天的起始时刻
import dateutil;import org.apache.hadoop.hive.ql.exec.UDF;import java.text.SimpleDateFormat;import java.util.Date;/** * 自定义函数,获取天的起始时刻 */public class DayBeginUDF extends UDF{ /** *今天零时刻 */ public long evaluate() { Date date = new Date(); return evaluate(date, 0); } public long evaluate(int offset) { Date date = new Date(); return evaluate(date, offset); } public long evaluate(long timestamp,int offset) { Date date = new Date(timestamp) ; return evaluate(date , offset) ; } public long evaluate(Date date,int offset) { return DateUtil.getDayBegin(date , offset) ; } public long evaluate(String date , String fmt ,int offset) { try{ SimpleDateFormat sdf = new SimpleDateFormat(fmt) ; return DateUtil.getDayBegin(sdf.parse(date) , offset) ; } catch(Exception e){ e.printStackTrace(); } return -1 ; }}
格式化时间串函数
import dateutil;import org.apache.hadoop.hive.ql.exec.UDF;import java.text.SimpleDateFormat;import java.util.Date;/** * 格式串函数 */public class FormatTimeUDF extends UDF{ public String evaluate(String fmt) { SimpleDateFormat sdf = new SimpleDateFormat(fmt) ; return sdf.format(new Date()) ; } public String evaluate(long timestamp,String fmt) { SimpleDateFormat sdf = new SimpleDateFormat(fmt); return sdf.format(new Date(timestamp)); } public String evaluate(Date date , String fmt) { SimpleDateFormat sdf = new SimpleDateFormat(fmt); return sdf.format(date); }}
自定义函数,获取月的起始时刻
import dateutil;import org.apache.hadoop.hive.ql.exec.UDF;import java.text.SimpleDateFormat;import java.util.Date;/** * 自定义函数,获取月的起始时刻 */public class MonthBeginUDF extends UDF { /** *今天零时刻 */ public long evaluate() { Date date = new Date(); return evaluate(date, 0); } public long evaluate(int offset) { Date date = new Date(); return evaluate(date, offset); } public long evaluate(long timestamp,int offset) { Date date = new Date(timestamp) ; return evaluate(date , offset) ; } public long evaluate(Date date,int offset) { return DateUtil.getMonthBegin(date , offset) ; } public long evaluate(String date , String fmt ,int offset) { try{ SimpleDateFormat sdf = new SimpleDateFormat(fmt) ; return DateUtil.getMonthBegin(sdf.parse(date) , offset) ; } catch(Exception e){ e.printStackTrace(); } return -1 ; }}
自定义函数,获取周的起始数据
import dateutil;import com.it18zhang.umeng.util.DateUtil;import org.apache.hadoop.hive.ql.exec.UDF;import java.text.SimpleDateFormat;import java.util.Date;/** * 自定义函数,获取周的起始时刻 */public class WeekBeginUDF extends UDF { /** *今天零时刻 */ public long evaluate() { Date date = new Date(); return evaluate(date, 0); } public long evaluate(int offset) { Date date = new Date(); return evaluate(date, offset); } public long evaluate(long timestamp,int offset) { Date date = new Date(timestamp) ; return evaluate(date , offset) ; } public long evaluate(Date date,int offset) { return DateUtil.getWeekBegin(date , offset) ; } public long evaluate(String date , String fmt ,int offset) { try{ SimpleDateFormat sdf = new SimpleDateFormat(fmt) ; return DateUtil.getWeekBegin(sdf.parse(date) , offset) ; } catch(Exception e){ e.printStackTrace(); } return -1 ; }}
启动thriftserver时,通过–jars指定jar包
start-thriftserver.sh --num-executors 12 --executor-cores 4 --conf spark.task.cpus=1 --executor-memory=4g --master yarn-client --jars udf.jar
注册函数
beeline中注册$beeline>create function getdaybegin as 'hive.udf.DayBeginUDF' ;$beeline>create function getweekbegin as 'hive.udf.WeekBeginUDF' ;$beeline>create function getmonthbegin as 'hive.udf.MonthBeginUDF' ;$beeline>create function formattime as 'hive.udf.FormatTimeUDF' ;
参考博文
http://blog.csdn.net/scgaliguodong123_/article/details/46993005
阅读全文
0 0
- 自定义-Hive自定义函数
- Hive 自定义函数函数
- Hive 自定义函数函数
- HIVE中的自定义函数
- hive用户自定义函数
- HIVE中的自定义函数 .
- HIVE中的自定义函数
- HIVE 自定义函数 UDF
- HIVE中的自定义函数
- hive中的自定义函数
- Hive自定义函数
- Hive自定义函数
- Hive自定义函数
- HIVE 自定义函数
- hive 自定义函数扩展
- Hive--自定义函数
- HIVE自定义函数类型
- Hive中自定义函数
- Hive2ElasticSearch
- oracle 11g 完全卸载方法
- JSON解析-开源jsoncpp---动态链接库生成
- 永久性重定向和元描述的介绍
- 设计师应该做到的简洁是什么
- Hive自定义函数
- SSM的web.xml模板
- 共词聚类分析
- 把数组排成最小的数
- 名副其实的cleanmymac 功能强大 操作简单
- 输出某一个月的日历
- 使用FMDB进行插入语句出现 obj = va_arg(args, id)错误
- 手动sql注入记录
- 6-11 求自定类型元素序列的中位数(25 分)