Hive經典SQL之行轉列,列轉行

2021-10-10 02:51:03 字數 2956 閱讀 1051

前言:目前做離線資料計算,由於之前沒有完整的數倉功能,前兩天把cdh的配置和自己的**又除錯了一遍,目前資料已經進入到hive原始資料ods層。使用到了這個經典函式,在這裡記錄一下。

版本:hive 1.1.0

建立表挺簡單的,這裡就不演示了。

stu_name

course

score

張三語文

98張三

數學95

張三英語

89李四

語文97

李四數學

88李四

英語90

2. 行轉列用法

-- 這裡我們將學科和成績兩列都拼接起來,後邊有用

select stu_name,

concat_ws(

',',collect_set(course)

)as course,

concat_ws(

',',collect_set(score)

)as score

from student_score_1

group

by stu_name

-- 結果為:

-- 張三 語文,數學,英語 98,95,89

-- 李四 語文,數學,英語 97,88,90

這個比較簡單,用法也比較簡單

concat_ws 中有兩個引數,第乙個是行轉列後 的分隔符,第二個是要拼接的陣列格式資料

collect_set 是去重的函式,並且返回要拼接的陣列格式資料

這裡擴充套件一下 collect_set 還有乙個兄弟 collect_list,區別就是set去重,list不去重,大家根據自己需要。

3. 列轉行用法

這裡就要著重說明了:因為上邊說到我們拼接了兩列,那如果要列轉行,轉一行沒問題,轉兩行就得用特殊寫法了

先說拆一列多多行的正確寫法

select stu_name, ecourse, escore

from student_score_2

lateral view explode(split(escore,

',')

) cr as escore

-- 這種比較簡單,結果正常顯示,但是如果用這個思想去拆多行,就不行了

-- 結果為:

-- 張三 語文,數學,英語 98

-- 張三 語文,數學,英語 95

-- 張三 語文,數學,英語 89

-- 李四 語文,數學,英語 97

-- 李四 語文,數學,英語 88

-- 李四 語文,數學,英語 90

在說拆多列為多行的錯誤思維做法

-- 再說拆多行的錯誤寫法

select stu_name, ecourse, escore

from student_score_2

lateral view explode(split(course,

',')

) cr as ecourse

lateral view explode(split(score,

',')

) cr as escore

這個sql看著也沒毛病,但是執行結果如下:

-- 結果為:

-- 張三 語文 98

-- 張三 語文 95

-- 張三 語文 89

-- 張三 數學 98

-- 張三 數學 95

-- 張三 數學 89

-- 張三 英語 98

-- 張三 英語 95

-- 張三 英語 89

-- 李四 語文 97

-- 李四 語文 88

-- 李四 語文 90

-- 李四 數學 97

-- 李四 數學 90

-- 李四 數學 89

-- 李四 英語 97

-- 李四 英語 88

-- 李四 英語 90

一看就不是自己想要多結果,原因也很簡單,這種寫會造成結果出現ecourse, escore 出現笛卡爾積,因為拆兩個字段轉行之後,兩個欄位轉成的行並沒有對應關係,所以只有笛卡爾積展示了

-- 再看正確的開啟方式,利用新的函式 po***plode 

select stu_name, ecourse, escore

from student_score_2

lateral view po***plode(split(course,

',')

) cr as a, ecourse

lateral view po***plode(split(score,

',')

) sc as b, escore

where a=b;

-- 結果為:

-- 張三 語文 98

-- 張三 數學 95

-- 張三 英語 89

-- 李四 語文 97

-- 李四 數學 88

-- 李四 英語 90

正確開啟方式才香!

hive的sql之行轉列和列轉行

collect set 要聚合的一列欄位名 去重 collect list 要聚合的一列欄位名 這兩個都是聚合函式 將一列資料聚集成乙個陣列集合 select collect set 要聚合的一列欄位名 from 加表名 concat ws 拼接符,可變個數的字串或陣列 可以拼接字串也可以拼接陣列中...

HIve之行轉列,列轉行操作

行轉列 將類似如下資料轉為,特徵值,標記資料 表名為test 3列c1,c2,c3資料如下 a,b,1 a,b,2 a,b,3 c,d,4 c,d,5 d,f 6 多行轉換為一列 select c1,c2,concat ws collect set c3 from test group by c1,...

經典SQL問題 行轉列《轉》

20人收藏此文章,我要收藏 贊0 學校裡面記錄成績,每個人的選課不一樣,而且以後會新增課程,所以不需要把所有課程當作列。資料庫grade裡面資料如下圖,假定每個人姓名都不一樣,作為主鍵。本文以mysql為基礎,其他資料庫會有些許語法不同。資料庫資料 處理後效果 下面介紹三種方法 方法一 1 2345...