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

前言:老劉不敢說寫的有多好,但敢保證儘可能用大白話把本身複習的內容詳細解釋出來,拒絕資料上的生搬硬套,作到有本身的瞭解!數據庫

1. hive知識點(3)

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

 

 

如今開始正文,仍是那句話,雖然這些都是hive的經常使用函數,不少人不在乎,可是平常開發中會遇到不少業務須要用到這些函數,咱們至少要熟悉一些經常使用函數,肚子裏有點貨。數組

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

2. hive當中的lateral view與explode

爲何會用到explode?大數據

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

需求:如今有數據格式以下 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          |
+-----------+-------------+--+

第一步:咱們先建立數據庫,並使用剛剛建立的數據庫3d

create database hive_explode;
use hive_explode;

第二步:建立完數據庫後,就要開始建立hive的表code

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形式,這一塊老劉雖然沒講,可是這塊真的很重要,根據這些複合函數裏面的分隔符,咱們的分割代碼是這樣寫的:orm

日常的空格形式是視頻

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類型字段。

接下來,咱們要作的就是建立表導入數據。

一、建立文件,注意數據使用\t進行分割

cd /kkb/install/hivedatas vim constellation.txt 孫悟空 白羊座 A 老王 射手座 A 宋宋 白羊座 B 豬八戒 白羊座 A 鳳姐 射手座 A

二、建立hive表並加載數據

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

三、加載數據

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

能夠查詢一下導入表後的狀況,select * from person_info.

 

四、查詢數據

注意注意,根據咱們的需求,查詢結果是須要進行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類型。

相關文章
相關標籤/搜索