hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行下面我們來看看.
Hive可以將類sql查詢語句轉換成Hadoop的map reduce任務,讓熟悉關系型數據庫的人也可以利用hadoop的強大并行計算能力,Hive提供了強大的內置函數支持,但是總有一些特殊情況,內置函數無法覆蓋,這就要求我們對定義自己的函數,接下來我們通過一個例子看一下如何自定義hive函數.
1.自定義函數的實現
假設我們的關系型數據庫中user表有一個status字段,代表著用戶的活躍等級,取值為1~10,活躍度一次遞增,現在我們要根據status字段將用戶分為3個活躍度等級,Hive顯然沒有這種與業務邏輯強耦合的內置函數,但這不應該成為阻礙我們使用Hive的理由,下面的擴展函數就可以滿足需求.
- package com.test.example;
- import org.apache.hadoop.hive.ql.exec.Description;
- import org.apache.hadoop.hive.ql.exec.UDF;
- import org.apache.hadoop.io.Text;
- public class UserStatus extends UDF {
- public Text evaluate(Text input) {
- if(input == null) return null;
- int status= Integer.parseInt(input.toString());
- if(status>= 1 && status<= 3){
- return new Text(String.valueOf(1));
- }else if(status>=4 && status<=7){
- return new Text(String.valueOf(2));
- }else if(status>=7 && status<=10){
- return new Text(String.valueOf(3));
- } //Vevb.com
- return null;
- }
- }
從上面的例子可以看出實現自定義的hive函數還是相當簡單的,就是繼承org.apache.hadoop.hive.ql.exec.UDF 并實現execute函數.
2.自定義函數的使用
定義為自定義函數后該如何使用呢?其實也是相關簡單的,假設包含自定義函數的jar包為mydf.jar.
(1).在hive shell中加載,首先加載jar包,并創建臨時函數.
- %> hive
- hive> ADD JAR /path/to/mydf.jar;
- hive> create temporary function userStatus as 'com.test.example.UserStatus';
然后就可以直接使用了.
hive> select userStatus(4);
但是每次使用都要加載一次,太費勁了,有沒有別的方法呢.
(2).在.hiverc中加載
編輯home目錄下的.hiverc文件,如果沒有這個文件就新建一個,將加載jar包的命令寫入.hiverc文件,啟動hive shell時會自動執行.hiverc文件,不需要每個shell都load一遍.
新聞熱點
疑難解答