1. 程式人生 > >hive函式--行轉列union all &一行拆多行lateral view explode&多行轉一行group_concat()

hive函式--行轉列union all &一行拆多行lateral view explode&多行轉一行group_concat()

工作幾年,越來越發現行列轉換非常重要,為了和上篇文章(hive函式--排序row_number,rank over)保持一致,這次繼續用學生成績的例子吧。

1.行轉列 union all:

result:student_id,class,score

學生的語數外物化都在一張表裡,每個學生對應有五行資料,如何變成:

student_id,chinese_score,math_score,english_score,physics_score,chemical_score,這樣一行顯示五列的結構呢?其實非常簡單,用union all 即可。注意下面的語句,其實是有些小技巧在裡面的:

select student_id,max(chinese_score

),max(math_score)math_score ,max(english_score)english_score,max(physics_score)physics_score,

max(chemical_score)chemical_score from(

select student_id,score chinese_score,0 math_score,0 english_score,0 physics_score, 0 chemical_score from result where class="語文"

union all

select student_id,0 chinese_score,score

math_score,0 english_score,0 physics_score, 0 chemical_score from result where class="數學"

union all

select student_id,0 chinese_score,0 math_score,score english_score,0 physics_score, 0 chemical_score from result where class="英語"

union all

select student_id,0 chinese_score,0 math_score,0 english_score,score physics_score, 0 chemical_score

from result where class="物理"

union all

select student_id,0 chinese_score,0 math_score,0 english_score,0 physics_score, score chemical_score from result where class="化學"

)a

group by student_id

注意:

1)union all 需要所有union的資料列名一致,所以所有的資料都有五列。

2)雖然所有的資料都有五列,但是實際有資料的只有一列,其餘資料以0補齊

3)最後結果出來的時候,要用max函式來取出實際的score。

4)實際處理資料的過程當中,可能存在並不是每個學生五門成績都有的情況,而有的學生可能就是考了0分,這時候想要知道到底是沒有成績還是成績為0的話,可以設預設值為-1(看情況自己決定,不衝突即可,string型別的資料可以設null哦)然後再取max,就可以區分了。

其實就是根據限制條件取出不同的資料放到不同列中,其餘資料以預設值補齊,最後取max即可

2.一行轉多行 lateral view explode()

實際的日誌為了傳輸方便,很可能將很多資料放在一條記錄裡,如果表變成了這樣:

result:

student_idscore_list
1語文-90;數學-100;英語-100;物理-98;化學-99

想要把合在一起的資料拆成5行能夠看的清晰一點又該怎麼樣呢?

注意,我之前遇到過平臺不支援分號的情況,這裡可以用\074來代替。

select student_id,split(scores,"-")[0] class ,split(scores,"-")[1] score

 from result a lateral view explode(split(score_list,"\074")) scores as scores

這個後面的as就是語法,還有explode裡面的得是一個數組

這樣就會產生5條記錄了,如果想分別用五列展示的話,用上面的union all就好啦

split函式功能:按照後面的分隔符分解前面的字串

3.多行轉一行group_concat

與上述問題相反,如果有5行資料想要合併成上述一列資料該如何操作呢?

select student_id,group_concat(concat(class,"-",score),"\074") from result group by student_id

concat:字串拼接,直接按順序來

group_concat:一看名字就知道和group有關,使用的時候得和group一起使用,按student_id分組之後,將分組的內容以;連線成一個字串。

相關推薦

hive函式--union all &一行lateral view explode&一行group_concat()

工作幾年,越來越發現行列轉換非常重要,為了和上篇文章(hive函式--排序row_number,rank over)保持一致,這次繼續用學生成績的例子吧。1.行轉列 union all:表result:student_id,class,score學生的語數外物化都在一張表裡,

hiveLATERAL VIEW explode

lateral view用於和split、explode等UDTF一起使用的,能將一行資料拆分成多行資料,在此基礎上可以對拆分的資料進行聚合,lateral view首先為原始表的每行呼叫UDTF,UDTF會把一行拆分成一行或者多行,lateral view在把結果組合,產生一個支援別名表的

hive find_in_set,get_json_object,lateral view explode函式

  今天寫幾個hive函式, find_in_set,get_json_object,lateral view explode,方便以後查詢話不多說開幹。find_in_set函式說兩點1.使用方法 SELECT FIND_IN_SET('b','a,b,c,d');

hsql中split函式lateral view explode的常規用法

1.split()函式 hsql中split(item,'分隔符')   2.lateral view explode將複雜結構一行拆成多行,實現行轉列,如 id     name 1      hell,

使用case when,union all實現sql轉行

-- 建表 CREATE TABLE StudentScores ( UserName NVARCHAR(20), -- 學生姓名 Subject

Hive裡實現資料的拆分、一行explode使用

    在做資料轉換、清洗的過程中,經常會對行進行拆分、一行資料拆分為多行資料,下面是簡單的例子:    如圖表裡有如下資料:最終要得到結果如下:先用split進行分割得到一個數組,在用explode拆分陣列。LATERAL VIEW explode(split(b,',')

Oracle根據【日期】組,其他條件根據PIVOT。使每個日期條件關聯的其他數據只有一行

col acl time pivot per clas 一行 crop group select OPER_TIME, MICROPAY, REFUND from ( select trunc(oper_time) oper_time,

除錯經驗——使用自定義函式在Oracle中實現類似LISTAGG函式(字串連線)功能

問題描述: LISTAGG函式是一個很實用的函式,但僅在Oracle 11.2以後的版本中才有。 生產環境中有個資料庫是Oracle 11.1,需要行轉列,但並不能使用LISTAGG函式。 解決方法: 參考以下文章: https://oracle-base.com/artic

SQL:decode函式

  前言   開發中我們經常會用到行轉列,這裡記錄一下我在專案中實現行轉列的思路。需求:報表模組,統計某機房機架的不同狀態(1 空閒  2 預佔  3 佔用)的數量(真實需求更為複雜,這裡只是討論技術,簡化一下)     decode函式   以下介紹摘自百度百科:  

Hive轉行

行轉列:使用hive的內建函式explode()進行轉化。 舉例: select movie, category_name from movie_info lateral view explode(category) table_tmp as category_nam

三秒+一個小Demo,輕鬆掌握Hive中的 轉行、!!!

閒話少敘,直接開幹! 先看Demo: 一、行轉列 首先,我們需要收集資料,建立一個檔案,內容如下: 一、啟動Hive,建立表並匯入資料: 1.1 建立表 create table test(name string,xingzuo string,xuexing string)

hive中的轉行

轉載於此 一、行轉列的使用 1、問題 hive如何將 a       b       1 a       b       2 a       b       3 c       d       4 c       d       5 c       d       6

HIVE 查詢顯示列名 及 顯示

hive預設查詢不會顯示列名, 當一個表字段比較多的時候,往往看不出值與列之間的對應關係,對日常查錯及定位問題帶來不便,應同事要求,看了HIVE CLI原始碼,做了下些許調整, 加入列頭列印及行轉列顯示功能 未開啟行轉列功能之前: hive>>> sele

PIVOT函式

PIVOT函式的格式如下 PIVOT(<聚合函式>([聚合列值]) FOR [行轉列前的列名] IN([行轉列後的列名1],[行轉列後的列名2],[行轉列後的列名3],.......[行轉列後的列名N])) <聚合函式>就是我們使用的SUM,COUNT,AVG等

sql內建函式pivot強大的功能

語法: PIVOT用於將列值旋轉為列名(即行轉列),在SQL Server 2000可以用聚合函式配合CASE語句實現 PIVOT的一般語法是:PIVOT(聚合函式(列) FOR 列 in (…) )AS P 完整語法: table_source PIVOT(

MySQL中GROUP_CONCAT函式長度限制處理/實現的功能

MySQL提供了一個很方便的函式group_concat可以實現行轉列的功能。 SELECT t.*, (SELECT GROUP_CONCAT(fellow_company_id) v1 FROM t_trade_fellow a WHERE fellow_type = '1' AND a.company_

Oracle的函式wm_concat的db2實現

      oracle的行轉列的函式wm_concat的功能很強大,db2同樣有個名叫聚合函式listagg()可以實現此功能       select listagg(id,',') from student;     listagg函式的詳細介紹:

Oracle 11g Pivot函式實現

先上語法規範: SELECT .... FROM PIVOT ( aggregate-function() FOR IN (, ,..., )

hive中同資料組合的方法以及array to string要點()

1. 同列多行資料組合成一個欄位cell的方法, top N 問題的hive方案 如下: hive 列轉行 to json與to array list set等複雜結構,hive topN的提取的視窗統計方法 select ll,

Oracle pivot函式基本用法

2018年9月30日22點,眼看著就10月份了,回頭看下,8月份就寫了一篇部落格,9月一篇都沒寫,想著還是得續一續。 剛好前幾天,幫一個群友處理了一個關於Oracle中行轉列,根據查詢中有的專案,動態轉列的做法。想著也挺好玩,不過看下時間,不太充足。所以暫時先寫個Oracl