天天看点

Hive函数、自定义UDF函数、Hive导入json数据自定义UDF函数 071. 内置函数2. Hive自定义函数3. UDF开发实例

1. 内置函数

Hive内置函数官方文档

1)查看系统自带的函数

2)显示自带的函数的用法

3)详细显示自带的函数的用法

2. Hive自定义函数

1)Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。

2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。

3)根据用户自定义函数类别分为以下三种:

(1)UDF(User-Defined-Function)

一进一出

(2)UDAF(User-Defined Aggregation Function)

聚集函数,多进一出

类似于:count/max/min

(3)UDTF(User-Defined Table-Generating Functions)

一进多出

如lateral view explore()

4)官方文档地址

Hive自定义函数官方文档

5)编程步骤

(1)继承org.apache.hadoop.hive.ql.UDF

(2)需要实现evaluate函数;evaluate函数支持重载;

6)注意事项

(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

(2)UDF中常用Text/LongWritable等类型,不推荐使用java类型;

3. UDF开发实例

3.1 转换大写字母 自定义UDF

  • 第一步:创建maven java 工程,导入jar包
<repositories>
    <repository>
        <id>cloudera</id>
 <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.0-cdh5.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>1.1.0-cdh5.14.0</version>
    </dependency>
</dependencies>
<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
         <version>2.2</version>
         <executions>
             <execution>
                 <phase>package</phase>
                 <goals>
                     <goal>shade</goal>
                 </goals>
                 <configuration>
                     <filters>
                         <filter>
                             <artifact>*:*</artifact>
                             <excludes>
                                 <exclude>META-INF/*.SF</exclude>
                                 <exclude>META-INF/*.DSA</exclude>
                                 <exclude>META-INF/*/RSA</exclude>
                             </excludes>
                         </filter>
                     </filters>
                 </configuration>
             </execution>
         </executions>
     </plugin>
</plugins>
</build>
           
  • 开发java类继承UDF,并重载evaluate 方法
public class ItcastUDF extends UDF {
    public Text evaluate(final Text s) {
        if (null == s) {
            return null;
        }
        //返回大写字母
        return new Text(s.toString().toUpperCase());

    }
}
           
  • 将我们的项目打包,并上传到hive的lib目录下
    Hive函数、自定义UDF函数、Hive导入json数据自定义UDF函数 071. 内置函数2. Hive自定义函数3. UDF开发实例
  • 添加我们的jar包

    重命名我们的jar包名称

cd /export/servers/hive-1.1.0-cdh5.14.0/lib
mv original-day_06_hive_udf-1.0-SNAPSHOT.jar udf.jar
           

hive的客户端添加我们的jar包

Hive函数、自定义UDF函数、Hive导入json数据自定义UDF函数 071. 内置函数2. Hive自定义函数3. UDF开发实例
  • 设置函数与我们的自定义函数关联
Hive函数、自定义UDF函数、Hive导入json数据自定义UDF函数 071. 内置函数2. Hive自定义函数3. UDF开发实例
  • 使用自定义函数
Hive函数、自定义UDF函数、Hive导入json数据自定义UDF函数 071. 内置函数2. Hive自定义函数3. UDF开发实例

3.2 Json数据解析UDF开发

3.2.1 原始数据

{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}
{"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"}
{"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"}
{"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"}
{"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"}
{"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"}
           

3.2.2 需求

需要将数据导入到hive数据仓库中

Hive函数、自定义UDF函数、Hive导入json数据自定义UDF函数 071. 内置函数2. Hive自定义函数3. UDF开发实例

3.2.3 分析

  • 自定义udf函数,将我们json数据给解析出来,解析成4个字段
    • 自定义JsonBean
public class JsonBean {

    /**
     * movie + "\t" + rate + "\t" + timeStamp + "\t" + uid
     */

    private String movie;
    private String rate;
    private String timeStamp;
    private String uid;

    public String getMovie() {
        return movie;
    }

    public void setMovie(String movie) {
        this.movie = movie;
    }

    public String getRate() {
        return rate;
    }

    public void setRate(String rate) {
        this.rate = rate;
    }

    public String getTimeStamp() {
        return timeStamp;
    }

    public void setTimeStamp(String timeStamp) {
        this.timeStamp = timeStamp;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    @Override
    public String toString() {
        return movie + "\t" + rate + "\t" + timeStamp + "\t" + uid;
    }
}
           
  • StrToJson代码
package cn.itcast.udf;

import cn.itcast.json.JsonBean;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

/**
 *
 */
public class StrToJson extends UDF {

    /**
     * @param src 一整行json字符串
     * @return 拼接好的 "\t" 连接的value字符串
     * evaluate
     */
    public Text evaluate(Text src) {

        if (src != null && src.toString() != "") {
            JsonBean jsonBean = JSON.parseObject(src.toString(), JsonBean.class);
            return new Text(jsonBean.toString());
        }
        return new Text("");
    }
}
           
  • 第二步: 注册我们的自定义函数
  • 第三步:创建一个临时表, 加载json格式的数据,加载到临时表里面的一个字段里面去
  • 第四步:insert overwrite local directory 将临时表当中的数据通过我们的自定义函数,给查询出来,放到本地路径下面去
  • 第五步:通过load data的方式,将我们得数据加载到新表当中去

继续阅读