当前位置: 首页 > 工具软件 > format-udf > 使用案例 >

【hive】hive----自定义UDF 函数-----时间格式化以及取出双引号的代码

江英卓
2023-12-01

一.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以及去除双引号以及时间格式化的代码以及描述。

 类似资料: