Hive函式(內建函式+自定義標準函式UDF)
Hive提供大量內建函式供開發者使用,也可以自定義函式使用
1、內建函式:
標準函式(字元函式、轉換函式、數學函式、日期函式、集合函式、條件函式 )
聚合函式
表生成函式
常用內建函式如下:
2、自定義函式
UDF:自定義標準函式
UDAF:自定義聚合函式
UDTF:自定義表生成函式
自定義標準函式UDF步驟:
1、java繼承UDF類編寫udf函式(evaluate())(一個類一個方法)
2、打fat包(包括所有依賴檔案)
3、把jar包放到linux上
–臨時udf函式
4、在hive命令列中使用add jar jar包路徑即可載入到臨時系統中
5、create temporary function 函式名 as ‘方法的全類名’
–永久udf函式
4、在linux命令列使用hdfs命令把jar上傳到hdfs的路徑
5、create function 函式名 as ‘方法的全類名’ using jar ‘jar包的全路徑’
示例:
1、需求:輸入字串轉成大寫
package cn.kgc.kb09.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
/**
* @Author
* @Date 2020/9/22
* @Description 功能:轉大寫
*/
public class TestUDF extends UDF {
public Text evaluate(Text str){
if (null==str){
return null;
}
return new Text(str.toString().toUpperCase());
}
// public static void main(String[] args) {
// TestUDF tu= new TestUDF();
// Text rst=tu.evaluate(new Text(args[0]));
// System.out.println(rst);
// }
}
2、打jar包,注意是fat包,包括依賴檔案,jar包名為:20200922testudf.jar;
3、將jar包拖拽到Linux系統;
為防止在第五步建立臨時函式時出現以下問題,需要進行相關操作
在Linux命令列輸入:
#下載zip包
yum install zip
#以下命令會刪除先前jar的簽名檔案(-d後面引數是自己jar包的名字)
zip -d 20200922testudf.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'
4、(臨時udf函式)在hive命令列中使用add jar jar包路徑即可載入到臨時系統中;
add jar /root/20200922testudf.jar;
5、hive命令列中create function 函式名 as ‘方法的全類名’ using jar ‘jar包的全路徑’,
出現ok表示成功。
create temporary function atoA as 'cn.kgc.kb09.udf.TestUDF';
6、呼叫函式
select atoA(abcdefg)
結果為:ABCDEFG
4、(永久udf函式)在linux命令列使用hdfs命令把jar上傳到hdfs的路徑
hdfs dfs -put20200922testudf.jar /apps/hive/functions
5、在hive命令列中create function 函式名 as ‘方法的全類名’ using jar ‘jar包的全路徑’
create function aToA2 as 'cn.kgc.kb09.udf.TestUDF' using jar 'hdfs://hadoop20:9000/apps/hive/functions/20200922testudf.jar';
6、呼叫函式
select atoA2(abc)
結果為:ABCDEFG
練習1:在一個時間基礎上,進行小時的加減,得到新的時間
package cn.kgc.kb09.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Author
* @Date 2020/9/22
* @Description 在一個時間基礎上,進行小時的加減,得到新的時間
*/
public class AddHour extends UDF {
public Text evaluate(Text beforeDate, IntWritable hours) throws Exception {
String d=beforeDate.toString();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(d);
String rst = sdf.format(new Date(date.getTime() + hours.get() * 60 * 60 * 1000));
return new Text(rst);
}
// public static void main(String[] args) throws Exception {
// AddHour ah=new AddHour();
// Text t=new Text("2020-09-22 10:20:00");
// IntWritable iw=new IntWritable(3);
// System.out.println(ah.evaluate(t, iw));
// }
}
練習2:計算兩個時間的時間差(小時)
package cn.kgc.kb09.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Author
* @Date 2020/9/22
* @Description 計算兩個時間的時間差(小時)
*/
public class HourDiff extends UDF {
public IntWritable evaluate(Text date1,Text date2) throws Exception {
String d1= date1.toString();
String d2 = date2.toString();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dt1 = sdf.parse(d1);
Date dt2 = sdf.parse(d2);
long diff = dt1.getTime() - dt2.getTime();
int rst = (int)diff / 1000 / 60 / 60;
return new IntWritable(rst);
}
// public static void main(String[] args) throws Exception {
// HourDiff hd =new HourDiff();
// System.out.println(hd.evaluate(new Text("2020-09-21 12:00:00"),
// new Text("2020-09-22 23:00:00")));
// }
}
相關文章
- Hive常用函式及自定義函式Hive函式
- hive內建函式Hive函式
- hive 3.0.0自定義函式Hive函式
- Hive中自定義函式Hive函式
- Apache Phoenix自定義函式(UDF)實踐Apache函式
- 自定義生成器函式模擬Python內建函式filter()函式PythonFilter
- SparkSQL -- 02 【SparkSQL檔案的讀取與落地,和Hive的整合,內建函式,自定義函式】SparkSQLHive函式
- webgl內建函式--通用函式Web函式
- HIVE自定義函式的擴充套件Hive函式套件
- Hive--->建立自定義的UDTF函式Hive函式
- java自定義equals函式和hashCode函式Java函式
- webgl內建函式--指數函式Web函式
- webgl內建函式--幾何函式與矩陣函式Web函式矩陣
- webgl內建函式--向量函式與紋理查詢函式Web函式
- 內建函式函式
- 如何在函式內部定義函式?函式
- Oracle 自定義函式Oracle函式
- shell自定義函式函式
- 【Spark篇】---SparkSql之UDF函式和UDAF函式SparkSQL函式
- PHP 自定義函式用法及常用函式集合PHP函式
- hive函式Hive函式
- python內建函式-eval()函式與exec()函式的區別Python函式
- JavaScript 設計模式系列 – 自定義函式(惰性函式)JavaScript設計模式函式
- MySQL 內建函式MySql函式
- js內建函式JS函式
- php 內建函式PHP函式
- python教程:自定義函式Python函式
- Hive函式大全Hive函式
- 指標函式 和 函式指標指標函式
- webgl內建函式--角度和三角函式Web函式
- Spark SQL使用簡介(2)--UDF(使用者自定義函式)SparkSQL函式
- hive學習筆記之七:內建函式Hive筆記函式
- 動畫函式的繪製及自定義動畫函式動畫函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- python常用內建函式Python函式
- Python內建函式(一)Python函式
- Python內建函式(二)Python函式
- 1.5.5 Python內建函式Python函式