Hive自定义函数UDF、UDTF、UDAF入门

详细讲解Hive自定义函数UDF、UDTF、UDAF基础知识,带你快速入门,首先在Hive中新建表”apache_log”

CREATE TABLE apachelog (
  host STRING,
  identity STRING,
  user STRING,
  time STRING,
  request STRING,
  status STRING,
  size STRING,
  referer STRING,
  agent STRING)
ROW FORMAT SERDE 'org.apache.Hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]*\\]]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*) (?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
STORED AS TEXTFILE;

这个是官方给出的实例,但是是错的。

Hive自定义函数UDF、UDTF、UDAF入门

不过,已经有人给做出了修改。

Hive自定义函数UDF、UDTF、UDAF入门

Hive自定义函数UDF、UDTF、UDAF入门

接下来结合一些样例数据

27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/faq.gif HTTP/1.1" 200 1127
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /data/cache/style_1_widthauto.css?y7a HTTP/1.1" 200 1292
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/hot_1.gif HTTP/1.1" 200 680
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/hot_2.gif HTTP/1.1" 200 682
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/filetype/common.gif HTTP/1.1" 200 90
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /source/plugin/wsh_wx/img/wsh_zk.css HTTP/1.1" 200 1482
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /data/cache/style_1_forum_index.css?y7a HTTP/1.1" 200 2331
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /source/plugin/wsh_wx/img/wx_jqr.gif HTTP/1.1" 200 1770
27.19.74.143 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/recommend_1.gif HTTP/1.1" 200 1028
110.52.250.126 - - [29/April/2016:17:38:20 +0800] "GET /static/image/common/logo.png HTTP/1.1" 200 4542
......

这个是apache服务器的日志信息,一共七个字段,分别表示:”host”、”identity”、”user”、”time”、”request”、”status”、”size”,在hive官网上是有九个字段的,剩下两个为:”referer”、”agent”。

------------------------------------------分割线------------------------------------------

样例数据相关资料可从以下信息得到下载:

点击这个 链接关注 Linux公社官方微信,关注后回复数字151443。即可得到网友的分享密码。

如果取消关注Linux公社公众号,即使再次关注,也将无法提供本服务!

链接:https://pan.baidu.com/s/1dvBorZch0WFPMPO2xqZTLQ 密码:获得见上面的方法,地址失效请在下面留言。

------------------------------------------分割线------------------------------------------

我们根据这些数据,从一些小需求中来体会一下这三种函数。

UDF(user-defined functions)
“小”需求:
 提取”time”,转换成”yyyy-MM-dd HH:mm:ss” 格式。

要点:
1.继承自“org.apache.hadoop.hive.ql.exec.UDF”;
2.实现”evaluate()”方法。

*JAVA 代码*
package com.hadoop.hivetest.udf;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.hadoop.hive.ql.exec.UDF;

public class MyDateParser extends UDF{
    public String evaluate(String s){
        SimpleDateFormat formator = new SimpleDateFormat("dd/MMMMM/yyyy:HH:mm:ss Z",Locale.ENGLISH);
        if(s.indexOf("[")>-1){
            s = s.replace("[", "");
        }
        if(s.indexOf("]")>-1){
            s = s.replace("]", "");
        }

try {
            //将输入的string转换成date数据类型
            Date date = formator.parse(s);
            SimpleDateFormat rformator = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return rformator.format(date);
        } catch (ParseException e) {
            e.printStackTrace();
            return "";
        }
    }
}

小插曲
导出为jar包,发送到Linux上。这次我们可以使用 editplus 编辑器来上传:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9b7cccbdb0109075eca3641232d7e1e7.html