大白話詳解大資料hive知識點,老劉真的很用心(3)

努力的老劉發表於2020-12-19

前言:老劉不敢說寫的有多好,但敢保證儘量用大白話把自己複習的內容詳細解釋出來,拒絕資料上的生搬硬套,做到有自己的瞭解!

1. hive知識點(3)

從這篇文章開始決定進行一些改變,老劉在部落格上主要分享大資料每個模組的重點知識點,對這些重點內容進行詳細解釋,每個模組的完整知識點分享在公眾號:努力的老劉。等有機會了,用視訊的方式先對每次分享的知識點進行一次分析和總結,再發文章進行詳細的解釋。

 

 

現在開始正文,還是那句話,雖然這些都是hive的常用函式,很多人不在意,但是日常開發中會遇到很多業務需要用到這些函式,我們至少要熟悉一些常用函式,肚子裡有點貨。

本篇文章中的explode、行轉列、列轉行是重點中的重點,需要熟練掌握它們的例項。由於hive偏於實操,老劉也只對這些重點知識點進行詳細的講解。

2. hive當中的lateral view與explode

為什麼會用到explode?

在實際開發過程中,會遇到很多複雜的array或者map結構,我們會根據一些業務要求把這些複雜的結構從一列拆成多行,這個時候就需要用到explode。可能你仍然不是很懂,現在就直接舉例說明這個explode,一定要跟著老劉一起練習。光看不練,等於白學!

需求:現在有資料格式如下
zhangsan    child1,child2,child3,child4 k1:v1,k2:v2
lisi    child5,child6,child7,child8  k3:v3,k4:v4

欄位之間使用\t分割,需求將所有的child進行拆開成為一列

+----------+--+
| mychild  |
+----------+--+
| child1   |
| child2   |
| child3   |
| child4   |
| child5   |
| child6   |
| child7   |
| child8   |
+----------+--+

將map的key和value也進行拆開,成為如下結果

+-----------+-------------+--+
| mymapkey  | mymapvalue  |
+-----------+-------------+--+
| k1        | v1          |
| k2        | v2          |
| k3        | v3          |
| k4        | v4          |
+-----------+-------------+--+

第一步:我們先建立資料庫,並使用剛剛建立的資料庫

create database hive_explode;
use hive_explode;

第二步:建立完資料庫後,就要開始建立hive的表

createtable hive_explode.t3(name string,children array<string>,address Map<string,string>) 
row format delimited fields terminated by '\t'  
collection items terminated by ','  
map keys terminated by ':' stored as textFile;

注意注意,大家一定要看仔細咯,由於我們的需求,要建立name,這是字串形式,但是child這塊它是array形式,address是map形式,這一塊老劉雖然沒講,但是這塊真的很重要,根據這些複合函式裡面的分隔符,我們的分割程式碼是這樣寫的:

平常的空格形式是

row format delimited fields terminated by '\t' 

array裡面的分割形式是

collection items terminated by ',' 

map裡面的分割形式是

map keys terminated by ':' 

這裡面的區別,大家要好好記住!

第三步:載入資料

cd  /kkb/install/hivedatas/

vim maparray
資料內容格式如下
zhangsan    child1,child2,child3,child4 k1:v1,k2:v2
lisi    child5,child6,child7,child8 k3:v3,k4:v4

然後利用hive載入資料

load data local inpath '/kkb/install/hivedatas/maparray' into table hive_explode.t3;

我們匯入資料後,可以看看錶裡面的情況。

 

第四步:之前是把資料匯入了表中,接下來就是對資料進行炸裂

將所有的child進行拆分成為一列

SELECT explode(children) AS myChild FROM hive_explode.t3;

 

接著將map的key和value也進行拆分

SELECT explode(address) AS (myMapKey, myMapValue) FROM hive_explode.t3;

由於lateral view 常常在行轉列和列轉行中使用,就不單獨講lateral view了。

3. 行轉列

首先關於行轉列和列轉行要說的是,它們非常非常重要,會遇到很多需要進行列轉換的需求。

但是呢,行轉列和列轉行並不是把1行轉為1列和1列轉為1行,很多資料對行轉列和列轉行都有自己的看法,常常是相反的。

老劉按照尚矽谷的來。我們們先不管這個概念,把它們的用法搞清楚即可。

行轉列:就是把多個列裡的資料變為1列。

用一個例子演示行轉列。

然後就是把星座和血型一樣的人歸類到一起,結果如下:

射手座,A            老王|冰冰
白羊座,A            孫悟空|豬八戒
白羊座,B            宋宋

這裡面還涉及到concat函式,先講一講連線函式:

concat():返回輸入字串連線後的結果,支援任意個輸入字串;

concat_ws():這個就是把一個分隔符加到連線的字串之間;

collect_set():將某欄位進行去重彙總,產生array型別欄位。

接下來,我們要做的就是建立表匯入資料。

1、建立檔案,注意資料使用\t進行分割

cd /kkb/install/hivedatas
vim constellation.txt

孫悟空    白羊座 A
老王    射手座 A
宋宋    白羊座 B       
豬八戒    白羊座 A
鳳姐    射手座 A

2、建立hive表並載入資料

create table person_info(name string,constellation string,blood_type string)  
row format delimited fields terminated by "\t";

3、載入資料

load data local inpath '/kkb/install/hivedatas/constellation.txt' into table person_info;

可以查詢一下匯入表後的情況,select * from person_info.

 

4、查詢資料

注意注意,根據我們的需求,查詢結果是需要進行concat_ws操作的。

select t1.base, concat_ws('|', collect_set(t1.name)) name from (select name, concat(constellation, "," , blood_type) base from person_info) t1 group by t1.base;

老劉解釋一下,由於星座和血型用逗號連線,所以我們應該這樣寫程式碼

concat(constellation, "," , blood_type)

接著就是先根據星座和血型一樣這個條件,查詢出所有的人。

select name, concat(constellation, "," , blood_type) base from person_info

把這個臨時表取名為t1,然後把查詢出來的人根據需求,多行轉一行。由於名字之間用 | 進行.連線的,所以我們應該這樣寫程式碼。

concat_ws('|', collect_set(t1.name))

最後的查詢結果是這樣的

select t1.base, concat_ws('|', collect_set(t1.name)) name from t1 group by  t1.base;

4. 列轉行

在列轉行中,會涉及到兩個非常重要的函式:explode和lateral view。

explode:將hive一列中複雜的array或者map結構拆分成多行。

lateral view:一般多用於將一行資料拆成多行資料,在此基礎上可以對拆分後的資料進行聚合。

舉例說明:

資料內容如下,欄位之間都是使用\t進行分割

cd /kkb/install/hivedatas

vim movie.txt
《疑犯追蹤》    懸疑,動作,科幻,劇情
《Lie to me》    懸疑,警匪,動作,心理,劇情
《戰狼2》    戰爭,動作,災難

將電影分類中的陣列資料展開,結果如下:

《疑犯追蹤》    懸疑
《疑犯追蹤》    動作
《疑犯追蹤》    科幻
《疑犯追蹤》    劇情
《Lie to me》    懸疑
《Lie to me》    警匪
《Lie to me》    動作
《Lie to me》    心理
《Lie to me》    劇情
《戰狼2》    戰爭
《戰狼2》    動作
《戰狼2》    災難

這就是典型的一行轉為多行,使用lateral view和explode結合。

我們第一步要做的就是根據表的特徵以及表裡面資料的特徵建立表,類別要建立為array型別。

create table movie_info(movie string, category array<string>) 
row format delimited fields terminated by "\t" 
collection items terminated by ",";

接著就是載入資料

load data local inpath "/kkb/install/hivedatas/movie.txt" into table movie_info;

最後根據需求查詢表,由於類別裡面是array型別,現在需要把類別利用lateral view炸開,然後就可以進行查詢資料。

select movie, category_name  from  movie_info 
lateral view explode(category) table_tmp as category_name;

其中,table_tmp是表名,category_name是列名。

5. 總結

老劉主要就講述了行轉列和列轉行,以及兩個函式explode和lateral view,並且分別用了兩個案列對他們進行了演示,大家一定要跟著案列練習一遍,光看不練,等於白學。

最後,完整的hive知識點(3)內容在公眾號:努力的老劉裡面。如果覺得有哪裡寫的不好或者有錯誤的地方,可以聯絡老劉,進行交流。希望能夠對大資料開發感興趣的同學有幫助,希望能夠得到同學們的指導。

如果覺得寫的不錯,給老劉點個贊!

這就是典型的一行轉為多行,使用lateral view和explode結合。

我們第一步要做的就是根據表的特徵以及表裡面資料的特徵建立表,類別要建立為array型別。

相關文章