1. 程式人生 > >Hive資料型別、 explode、自定義UDF

Hive資料型別、 explode、自定義UDF

Hive資料型別、 explode、自定義UDF

一、基本型別
在這裡插入圖片描述
二、複雜型別
在這裡插入圖片描述
三、陣列型別 array
  案例一、
  元資料:
   100,200,300
   200,300,500
  建表語句:create external table ex(vals array) row format delimited fields terminated by ‘\t’ collection items terminated by ‘,’ location ‘/ex’;
  查詢語句:
   查詢每行陣列的個數 select size(vals) from ex;
   select vals[0] from ex;查詢的是第一行的資料。
  注:hive 內建函式不具備查詢某個具體行的陣列元素。需要自定義函式來實現
  案例二、
  元資料:
   100,200,300 tom,jary
   200,300,500 rose,jack
  建表語句:create external table ex1(info1 array,info2 array) row format delimited fields terminated by ‘\t’ collection items terminated by ‘,’ location
‘/ex’;
四、map型別


  案例一、
  元資料:
   tom,23
   rose,25
   jary,28
  建表語句:
   create external table m1 (vals map<string,int>) row format delimited fields terminated by ‘\t’ map keys terminated by ‘,’ location ‘/map’;
  如果是map型別,列分隔符必須是\t
  查詢語句:select vals[‘tom’] from ex;
五、struct 型別(物件型別)
  元資料:
   tom 23
   rose 22
   jary 26
  建表語句:
   create external table ex (vals structname:string,age:int
)row format delimited collection items terminated by ‘,’ location ‘/m1’;
  查詢語句:select vals.age from s1 where vals.name=‘tom’;
六、collect_set
  collect_set 函式用於資料去重,並將結果形成陣列返回
七、 explode
  explode 命令可以將行資料,按指定規則切分出多行
  原資料:
   100,200,300
   200,300,500
  建立表::create external table ex1 (num string) location ‘/ex’;
  注:用explode做行切分,注意表裡只有一列,並且行資料是string型別,因為只有字元型別才能做切分。
  通過explode指令來做行切分:執行:select explode(split(num,’,’)) from ex1;
八、UDF

  如果hive的內建函式不夠用,我們也可以自己定義函式來使用,這樣的函式稱為hive的使用者自定義函式,簡稱UDF。
  實現步驟:
   1.新建java工程,匯入hive相關包,匯入hive相關的lib。
   2.建立類繼承UDF
   3.自己編寫一個evaluate方法,返回值和引數任意

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

public class ToUpper extends UDF{
	public String evaluate(String str){
		return str.toUpperCase();
	}
}

4.為了能讓mapreduce處理,String要用Text處理。
  5.將寫好的類打成jar包,上傳到linux中
  6.在hive命令列下,向hive註冊UDF:add jar /xxxx/xxxx.jar
  7.在hive命令列下,為當前udf起一個名字:create temporary function fname as ‘類的全路徑名’;
  8.之後就可以在hql中使用該自定義函數了。