hive 中自定義UDF函數和自定義UDTF函數步驟


一 、自定義UDF函數

前期准備

  在maven工程中導入依賴

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>1.2.1</version>
        </dependency>
</dependencies>



<!-- 打包的配置 -->
<build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin </artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>wccount.MyWcDriver</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

代碼走起

注意點:1、類需要繼承org.apache.hadoop.hive.ql.UDF

    2、方法名必須是evaluate,支持重載;

    3、必須要有返回類型,可以返回null,但是返回類型不能為void;

public class MYUDF extends UDF {
    public int evaluate (int num ){
        return num + 10;
    }
}

hive中配置

1、首先利用maven打包,把jar包放入hive目錄下的auxlib文件夾下(自己新建,如果是其他名字hive重啟后會讀不到,需要每次都重新add jar)

2、進入hive,添加jar包

add jar linux_jar_path//jar包絕對路徑

3、創建函數

create [temporary] function [dbname.]function_name AS class_name;
--temporary,是否創建臨時函數
--dbname.   用戶自定義的函數是以庫為單位的,在其他庫要想調用函數需要    庫名.函數名   來使用
--class_name    指的是編寫類的全類名

注意點:

當要修改jar包時,需要替換舊jar包,然后重啟Hive客戶端即可!!

二、自定義UDTF函數

代碼走起

重點:1、類要繼承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;

   2、需要重寫 initialize(),process(),close()三個方法

public class MyUDTF extends GenericUDTF {

    private ArrayList<String> outList = new ArrayList<>();

    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {


        //1.定義輸出數據的列名和類型(固定格式)
        List<String> fieldNames = new ArrayList<>();
        List<ObjectInspector> fieldOIs = new ArrayList<>();

        //2.添加輸出數據的列名和類型
        fieldNames.add("lineToWord");
        //字符串的固定格式
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
    }

    @Override
    public void process(Object[] args) throws HiveException {
        
        //1.獲取原始數據
        String arg = args[0].toString();

        //2.獲取數據傳入的第二個參數,此處為分隔符
        String splitKey = args[1].toString();

        //3.將原始數據按照傳入的分隔符進行切分
        String[] fields = arg.split(splitKey);

        //4.遍歷切分后的結果,並寫出
        for (String field : fields) {

            //集合為復用的,首先清空集合
            outList.clear();
            /**
這里也需要把結果寫進集合或數組里再輸出
*/
            //將每一個單詞添加至集合
            outList.add(field);

            //將集合內容寫出
            forward(outList);
        }
    }

    @Override
    public void close() throws HiveException {

    }
}
                                

其他步驟同上

自定義UDAF

參考鏈接    https://blog.csdn.net/weixin_38750084/article/details/82780461


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM