資料倉儲建模工具之一——Hive學習第七天

shmil發表於2024-07-26

5、Hive內建函式(分割槽和排序後面學習hive中的函式)

UDF:一對一

UDTF:一對多

UDAF:多對一

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
-- 1.檢視系統自帶函式
show functions;
-- 2.顯示自帶的函式的用法
desc function xxxx;
-- 3.詳細顯示自帶的函式的用法
desc function extended upper;

5.1 內建函式分類

關係運算子:包括 = 、 <> 、 <= 、>=等

算數運算子:包括 + 、 - 、 *、/等

邏輯運算子:包括AND 、 && 、 OR 、 || 等

複雜型別建構函式:包括map、struct、create_union等

複雜型別運算子:包括A[n]、Map[key]、S.x

數學運算子:包括ln(double a)、sqrt(double a)等

集合運算子:包括size(Array)、sort_array(Array)等

型別轉換函式: binary(string|binary)、cast(expr as )

日期函式:包括from_unixtime(bigint unixtime[, string format])、unix_timestamp()等

條件函式:包括if(boolean testCondition, T valueTrue, T valueFalseOrNull)等

字串函式:包括acat(string|binary A, string|binary B…)等

其他:xpath、get_json_objectscii(string str)、con

5.2 UDTF hive中特殊的一個功能(進一出多)

-- UDF 進一出一


-- UDAF 進多出一
-- collect_set()和collect_list()都是對多列轉成一行,區別就是list裡面可重複而set裡面是去重的
-- concat_ws(':',collect_set(type))   ':' 表示你合併後用什麼分隔,collect_set(stage)表示要合併表中的那一列資料
select 欄位名,concat_ws(':',collect_set(列名)) as 別名 from 表名 group by id;

-- UDTF 進一出多
-- explode  將hive某列一行中複雜的 array 或 map 結構拆分成多行(只能輸入array或map)
-- 扁平化(炸裂函式)可以將一組陣列的資料變成一列表
select  explode(split(列名,"資料的分隔符")) from 表名;
-- lateral view 表生成函式,可以將explode的資料生成一個列表
select id,name,列名 from 表1,lateral view explode(split(表1.列名,"資料的分隔符"))新列名 as 別列名;
  • 解釋:Lateral View其實就是用來和像類似explode這種UDTF函式聯用的lateral view會將UDTF生成的結果放到一個虛擬表中,然後這個虛擬表會和輸入行進行join來達到連線UDTF外的select欄位的目的。
-- 建立資料庫表
create table t_movie1(
id int,
name string,
types string
)
row format delimited fields terminated by ','
lines terminated by '\n';

-- 電影資料  movie1.txt
-- 載入資料到資料庫 load data inpath '/hive_test/movie1.txt' into table t_movie1;
1,這個殺手不太冷,劇情-動作-犯罪
2,七武士,動作-冒險-劇情
3,勇敢的心,動作-傳記-劇情-歷史-戰爭
4,東邪西毒,劇情-動作-愛情-武俠-古裝
5,霍位元人,動作-奇幻-冒險

-- explode  可以將一組陣列的資料變成一列表
select  explode(split(types,"-")) from t_movie1;

-- lateral view 表生成函式,可以將explode的資料生成一個列表
select id,name,type from t_movie1 lateral view explode(split(types,"-")) typetable as type;
-- 建立資料庫表
create table t_movie2(
id int,
name string,
type string
)
row format delimited fields terminated by ','
lines terminated by '\n';

-- 電影資料 movie2.txt
-- 載入資料到資料庫 load data inpath '/hive_test/movie2.txt' into table t_movie2;
1,這個殺手不太冷,劇情
1,這個殺手不太冷,動作
1,這個殺手不太冷,犯罪
2,七武士,動作
2,七武士,冒險
2,七武士,劇情
3,勇敢的心,動作
3,勇敢的心,傳記
3,勇敢的心,劇情
3,勇敢的心,歷史
3,勇敢的心,戰爭
4,東邪西毒,劇情
4,東邪西毒,動作
4,東邪西毒,愛情
4,東邪西毒,武俠
4,東邪西毒,古裝
5,霍位元人,動作
5,霍位元人,奇幻
5,霍位元人,冒險

-- collect_set()和collect_list()都是對列轉成行,區別就是list裡面可重複而set裡面是去重的
-- concat_ws(':',collect_set(type))   ':' 表示你合併後用什麼分隔,collect_set(stage)表示要合併表中的那一列資料
select id,concat_ws(':',collect_set(type)) as types from t_movie2 group by id;

類似於上述的查詢操作,其實hive是不經過mapreduce任務的,是因為hive對操作過程進行了最佳化,所以速度很快。

5.3 WordCount案例

資料準備

hello,world
hello,bigdata
like,life
bigdata,good,hello,world
bigdata,java,hadoop

建表

create table wc
(
line string
)
row format delimited fields terminated by '\n';

匯入資料

load data local inpath '/usr/local/soft/data/wc1.txt' into table wc;

步驟1:先對一行資料進行切分

select split(line,',') from wc;

步驟2:將行轉列

select explode(split(line,',')) from wc; 

步驟3:將相同的進行分組統計

select w.word,count(*) from (select explode(split(line,',')) as word from wc) w group by w.word;

相關文章