UDF函数开发

标准函数(UDF):以一行数据中的一列或者多列数据作为参数然后返回解雇欧式一个值的函数,同样也可以返回一个复杂的对象,例如array,map,struct。

聚合函数(UDAF):接受从零行到多行的零个到多个列,然后返回单一值。例如sum函数。

生成函数(UDTF):接受零个或者多个输入,然后产生多列或者多行输出。

udf函数开发

当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);
    }

}
udf代码示例

相关文章: