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包
- 設定函數與我們的自定義函數關聯
- 使用自定義函數
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資料倉庫中
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的方式,将我們得資料加載到新表當中去