标签:table cap 实例 div ora gen 多行 close ado
标准函数(UDF):以一行数据中的一列或者多列数据作为参数然后返回解雇欧式一个值的函数,同样也可以返回一个复杂的对象,例如array,map,struct。
聚合函数(UDAF):接受从零行到多行的零个到多个列,然后返回单一值。例如sum函数。
生成函数(UDTF):接受零个或者多个输入,然后产生多列或者多行输出。
当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数,用户自定义函数(user defined function),针对单条记录。编写一个UDF,需要继承UDF类,并实现evaluate()函数。在查询执行过程中,查询中对应的每个应用到这个函数的地方都会对这个类进行实例化。对于每行输入都会调用到evaluate()函数。而evaluate()函数处理的值会返回给Hive。同时用户是可以重载evaluate方法的。Hive会像Java的方法重载一样,自动选择匹配的方法。
littlebigdata.txt
edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10 bob,bob@test.net,10-10-2004,10.10.10.1,M,50 sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2
create table if not exists littlebigdata( name string, email string, bday string, ip string, gender string, anum int ) row format delimited fields terminated by ‘,‘;
load data local inpath ‘littlebigdata.txt‘ into table littlebigdata;
import java.text.SimpleDateFormat; import java.util.Date; import org.apache.hadoop.hive.ql.exec.UDF; import org.junit.Test; public class UDFZodiacSign extends UDF { private SimpleDateFormat df ; public UDFZodiacSign() { df = new SimpleDateFormat("MM-dd-yyyy"); } public String evaluate(Date bday){ return evaluate(bday.getMonth(),bday.getDay()); } public String evaluate(String bday){ Date date =null; try{ date = df.parse(bday); } catch(Exception ex){ System.out.println("异常"); ex.printStackTrace(); return null; } return evaluate(date.getMonth()+1,date.getDay()); } public String evaluate(Integer month,Integer day){ if(month ==1){ if(day<20){ return "Capricorn"; }else{ return "Aquarius"; } } if(month ==2){ if(day<19){ return "Capricorn"; }else{ return "Pisces"; } } if(month ==3){ if(day<20){ return "Pisces"; }else{ return "Aries"; } } if(month ==4){ if(day<20){ return "Aries"; }else{ return "Taurus"; } } if(month ==5){ if(day<20){ return "Taurus"; }else{ return "Gemini"; } } if(month ==6){ if(day<21){ return "Gemini"; }else{ return "Cancer"; } } if(month ==7){ if(day<22){ return "Cancer"; }else{ return "Leo"; } } if(month ==8){ if(day<23){ return "Leo"; }else{ return "Virgo"; } } if(month ==9){ if(day<22){ return "Virgo"; }else{ return "Libra"; } } if(month ==10){ if(day<24){ return "Libra"; }else{ return "Scorpio"; } } if(month ==11){ if(day<22){ return "Scorpio"; }else{ return "Sagittarius"; } } if(month ==12){ if(day<22){ return "Sagittarius"; }else{ return "Capricorn"; } } return null; } @Test public void test() { UDFZodiacSign aa = new UDFZodiacSign(); String str = aa.evaluate("01-10-2004"); System.out.println(str); } }
add jar testUDF-0.0.1-SNAPSHOT.jar; create temporary function zodiac as "cn.rtmap.bigdata.hive.testUDF.udf.UDFZodiacSign";
select name,bday,zodiac(bday) from littlebigdata;
edward capriolo 2-12-1981 Capricorn bob 10-10-2004 Libra sara connor 4-5-1974 Aries
注意:这个地方可能有报错,反正我是遇到了!
解决办法:
<property> <name>hive.aux.jars.path</name> <value>file:///jarpath/all_new1.jar,file:///jarpath/all_new2.jar</value> </property>
标签:table cap 实例 div ora gen 多行 close ado
原文地址:http://www.cnblogs.com/chushiyaoyue/p/6632090.html