Hive學習筆記 行列互轉

2021-10-23 11:54:04 字數 3269 閱讀 1007

當某一維度或多維度組合下出現多行資料,如何將其聚合至一行進行儲存?

表名:tbl_student_score

字段:stu_id:學號;stu_name:姓名;subject:學科;score:分數;

學號姓名

學科分數

1001

張三數學

991001

張三語文

601001

張三英語

701002

李四數學

1001002

李四語文

991002

李四英語

981003

王五數學

951003

王五語文

801003

王五英語

99最終結果展示:

學號姓名

學科分數

1001

張三數學,語文,英語

99,60,70

1002

李四數學,語文,英語

100,99,98

1003

王五數學,語文,英語

95,80,99

select

stu_id,

stu_name,

concat_ws(',', collect_set(subject)) as subject,

concat_ws(',', collect_set(score)) as score

from tbl_student_score

group by

stu_id,

stu_name;

select

stu_id,

stu_name,

concat_ws(',', collect_list(subject)) as subject,

concat_ws(',', collect_list(score)) as score

from tbl_student_score

group by

stu_id,

stu_name;

函式用法

返回結果型別

作用collect_set

collect_set(column)

array

收集 group by 聚合字段,返回去重後陣列(集合)

concat_ws

concat_ws(separator, columna, columnb,…)

string

以指定分隔符(separator)連線多個字串

collect_list

collect_list(column)

array

收集 group by 聚合字段,返回不去重後陣列(集合)

當某一行資料中的某一列或某些列資料聚合多個資料,如何將其拆解並分行儲存?

表名:tbl_student_score_collect

字段:stu_id:學號;stu_name:姓名;subject:學科;score:分數;

學號姓名

學科分數

1001

張三數學,語文,英語

99,60,70

1002

李四數學,語文,英語

100,99,98

1003

王五數學,語文,英語

95,80,99

最終結果展示:

結果1:

學號姓名

學科1001

張三數學

1001

張三語文

1001

張三英語

1002

李四數學

1002

李四語文

1002

李四英語

1003

王五數學

1003

王五語文

1003

王五英語

結果2:

學號姓名

學科分數

1001

張三數學

991001

張三語文

601001

張三英語

701002

李四數學

1001002

李四語文

991002

李四英語

981003

王五數學

951003

王五語文

801003

王五英語

99

select

stu_id,

stu_name,

subject_explode

from tbl_student_score_collect

lateral view explode(split(subject,',')) sbj as subject_explode;

select

stu_id,

stu_name,

subject_explode,

score_explode

from tbl_student_score_collect

lateral view po***plode(split(subject,',')) sbj as pos, subject_explode

lateral view po***plode(split(socre,',')) sc as pos, score_explode

where sbj.pos = sc.pos;

函式用法

返回結果型別

作用explode

explode(array)

string

將列中複雜的array資料拆分成多行元素

po***plode

po***plode(array)

string

將列中複雜的array資料拆分成多行元素,同時返回元素在資料中的索引位置

基本描述:

lateral view一般與udtf(使用者自定義生成函式)結合使用,如,explode(),split();將udtf應用於表中的每一行,然後將結果輸出行連線到輸入行,以形成具有提供表別名的虛擬表。

基本語法:

select

***,

***x,

columnalias

from tbl_name

lateral view udtf(expression) tablealias as columnalias (',' columnalias)*

hive行列互轉

先說行轉列是什麼意思啊,假設有這樣的資料,uid表示使用者,time表示時刻,event表示使用者這個時刻在幹什麼,我們儲存到資料庫中就是這樣的 uidtime event a09 01 00睜眼a 09 02 00 找手機a 09 03 00發呆a 09 04 00洗臉a 09 05 00刷牙a ...

sql 行列互轉

1 行轉列 現有資料 期望資料 1.1建表建資料 if object id temp 20170701 u is not null drop table temp 20170701 create table temp 20170701 id int primary key identity 1,1 ...

Hive 行列轉換

在京東眾多業務中,業務充滿了複雜性和挑戰性,因為業務的靈活性,很多資料都儲存成xml和json格式資料,這就要求下游資料分析師們需要對其做解析後方可使用 在眾多操作中 有一種是需要對資料做行列轉換操作。資料結構 create external table jd row to column jd id...