Hive中的兩種行列轉換

2021-10-11 01:53:59 字數 2918 閱讀 9395

2.字串合併與拆分形式的行列轉換

總結資料如下:

name   item   score

張三 數學 58

張三 英語 83

張三 語文 89

李四 數學 67

李四 英語 35

李四 語文 92

王五 數學 75

王五 英語 88

王五 語文 70

要求將每個人各科成績打在一行上,分成三列顯示,即,目標資料如下:

select 

name,

sum(

case

when item=

'數學'

then score end

)as math,

sum(

case

when item=

'英語'

then score end

)as english,

sum(

case

when item=

'語文'

then score end

)as chinese

from col_to_row

group

by name;

查詢結果:

上述使用的sum聚合函式只是為了分組,這裡使用max和min也可以達到同樣的效果

現有上述查詢結果的資料,要求查詢出最開始的資料,這裡用到乙個比較有趣的函式,str_to_map(詳解見文末),先用用concat + & 取表字段拼接成map型別,然後用str_to_map函式根據"&「和組成map時候的kv鍵值對的中間的符號,一般為」=「或」:",將kv值打在兩列上。lateral view explode在案例二詳細介紹

select b.name name,

a.item item,

a.score score

from row_to_col b

lateral view explode(

str_to_map(concat(

'數學='

,math,

'&英語='

,english,

'&語文='

,chinese)

,'&'

,'='

)) a as item,score;

注:row_to_col是根據上述查詢落的表

結果如下:

str_to_map(字串引數, 分隔符1, 分隔符2)

使用兩個分隔符將文字拆分為鍵值對。

分隔符1將文字分成kv對,分隔符2分割每個kv對。對於分隔符1預設分隔符是 『,』,對於分隔符2預設分隔符是 『=』。

我們在工作中經常會遇到這種情況,資料中的一對多情況,需要變成一對一,把多的那一部分拼接到乙個字段裡面顯示,比如乙個代表處下面有多個辦事處,但是現在需要把多個辦事處放一起,一條資料展示;還比如乙個合同可能相關跟進人很多,現在需要直接把這多個相關人都列出來在乙個欄位裡。

資料如下:

region  city

襄陽 老河口

襄陽 谷城

襄陽 南漳

襄陽 宜城

黃岡 黃州

黃岡 羅田

黃岡 蘄春

要求將每個地區所轄的市縣打在一行上,在乙個字段顯示,即,目標資料如下:

region  cities

襄陽 老河口,谷城,南漳,宜城

黃岡 黃州,羅田,蘄春

查詢語句:

select region,

concat_ws(

',',collect_set(city)

) cities

from region_city

group

by region;

查詢結果:

取列表裡面的值時還可以用另乙個函式,collect_list,區別就在於collect_list允許重複值存在,而collect_set對重複值去重

現有上述查詢結果的資料,要求查詢出案例二最開始的資料,這裡我們也要用到letaral view explode

select region,

city

from split_to_city lateral view explode(split(cities,

',')

) t_city as city;

注:explode就是將hive一行中複雜的array或者map結構拆分成多行,lateral view與explode是極好的搭檔,explode將複雜結構一行拆成多行,然後再用lateral view做各種聚合。

結果如下:

行列轉換是sql中經常要用到的技巧,hive sql也有其自身獨特的實現方式,這也是面試中經常會遇到的。後續有時間再將幾種資料庫的行列轉換做乙個總結。

hive中兩種日期格式的轉換

在解析埋點資料時會遇到兩種不同的日期格式 yyyymmdd和yyyy mm dd,此型別之間的轉換主要有兩種思路 第一種方法 from unixtime unix timestamp 20180905轉成2018 09 05 select from unixtime unix timestamp 2...

hive中兩種日期格式的轉換

在解析埋點資料時會遇到兩種不同的日期格式 yyyymmdd和yyyy mm dd,此型別之間的轉換主要有兩種思路 第一種方法 from unixtime unix timestamp 20180905轉成2018 09 05 select from unixtime unix timestamp 2...

MongoDB 同步 Hive 的兩種方式

使用 datax mongodb based 說明 1.如果mongo 文件 即記錄行 字段個數不定,對確實的字段 datax 讀取不到,最後hive 將產生錯列。可通過重寫mongodbreader修正。2.mongodb based 方式直接連線hidden節點,使用com.mongodb.ha...