Hive的UDF函數簡單示例開發

Hive函數

1.1、內置函數

內容較多,見《Hive官方文檔》

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

 

1)查看系統自帶的函數

hive> show functions;

2)顯示自帶的函數用法

hive>desc function upper;

3)詳細顯示自帶的函數用法

hive>desc function extended upper;

1.2Hive自定義函數

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)官方文檔地址

https://cwiki.apache.org/confluence/display/Hive/HivePlugins

5)編程步驟:

(1繼承org.apache.hadoop.hive.ql.UDF

(2需要實現evaluate函數;evaluate函數支持重載;

6)注意事項

(1)UDF必須要有返回類型,可以返回null,但是返回類型不能爲void;

(2UDF中常用Text/LongWritable類型,不推薦使用java類型;

 

1.3、UDF開發實例

簡單UDF示例

第一步創建maven  java 工程,導入jar包

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>bigdata_12</artifactId>
        <groupId>cn.itcast.bigdata</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>day06_hiveudf</artifactId>


    <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>


</project>

第二步:開發java類繼承UDF,並重載evaluate方法

package cn.itcast.hive.udf;

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

public class MyUDF extends UDF {
    /**
     * 繼承UDF這個類 然後重寫evalute這個方法,方法的參數就是
     * 我們傳入進來的數據
     * @param line
     * @return
     */
    public Text evaluate(final Text line){
        if(null != line  && !line.toString().equals("")){
            //將我們的一行數據轉換成大寫
            String str = line.toString().toUpperCase();
            line.set(str);
            return line;
        }
        line.set("");
        return line;
    }


}

第三步:將我們的項目打包,並上傳到hive的lib目錄下

第四步:添加我們的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包

add jar /export/servers/hive-1.1.0-cdh5.14.0/lib/udf.jar;

第五步:設置函數與我們的自定義函數關聯

create temporary function tolowercase as 'cn.itcast.udf.ItcastUDF';

第六步使用自定義函數

select tolowercase('abc');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章