hive 行列轉換案例

2021-08-27 22:35:07 字數 3993 閱讀 7244

0  stu表資料:

stu:

id             name

hello,you zm2008

hello,me zm2015

1 實現單詞計數:     (列轉行)  ---> split切分+explode(炸開)

1.0 資料拆分成陣列

select split(id,',') from  stu;    得到陣列

[hello,you]

[hello,me]

1.1 繼續將陣列拆分(hive explode函式會將陣列繼續拆分成單個字元)

select explode(split(id,','))  from stu;   窗體函式

hello

youhello

me1.2 分組統計:

select t1.c1, count(1) from (select explode(split(id,',')) as c1  from stu)  t1 group by t1.c1;

hello 2

you 1

me 1

上述語句中, t1表是1.1的結果

2  行轉列:  明確以哪個字段分組,分組後將列轉成行使用

--->  多列間隔符concat_ws+封裝多列組合體 collect_set+ 分組字段 grtoup by

公式: concat_ws(",",collect_set(要轉成行的列))  group by 分組列

2.0 表資料

列轉換行:

user

id name

1 zhangsan

2 lisi

3 wangwu

address

name     addr

zhangsan beijing

zhangsan shanghai

lisi tianjin

wangwu nanjing

期待結果:

1 zhangsan beijing,shanghai

2 lisi tianjin

3 wangwu nanjing

2.1  函式介紹:

collect_set(x)   列轉行函式---沒有重複, 組裝多列的資料的結構體

collect_list(x)   列轉行函式---可以有重複,組裝多列的資料的結構體

concat_ws 拼接函式, 用於多列轉成同一行字段後,間隔符

2.2 操作步驟:

2.2.0:

select user.id, user.name, address.addr from user join address on user.name = address.name;

1 zhangsan beijing

2 zhangsan shanghai

3 lisi tianjin

4 wangwu nanjing

2.2.1:

select max(user.id), user.name, collect_set(address.addr) from user join address on user.name = address.name group by user.name;

2 lisi [tianjin]

3 wangwu [nanjing]

1 zhangsan [shanghai,beijing]

2.2.2: 以name分組,將name相同下的 addr列轉變成行儲存,並且分組後列為多個下下以,做間隔

select max(user.id) as id, user.name, concat_ws(",",collect_set(address.addr)) from user join address on user.name = address.name group by user.name order by id;

1 zhangsan shanghai,beijing

2 lisi tianjin

3 wangwu nanjing

2.3 多行轉換一列案例2:

一、問題

hive如何將

a b 1

a b 2

a b 3

c d 4

c d 5

c d 6

變為:a b 1,2,3

c d 4,5,6

二、資料

test.txt

a b 1

a b 2

a b 3

c d 4

c d 5

c d 6

三、答案

1.建表

drop table tmp_jiangzl_test;

create table tmp_jiangzl_test

(col1 string,

col2 string,

col3 string

)row format delimited fields terminated by '\t'

stored as textfile;

load data local inpath '/home/jiangzl/shell/test.txt' into table tmp_jiangzl_test;

2.處理

select col1,col2,concat_ws(',',collect_set(col3))

from tmp_jiangzl_test

group by col1,col2;

3 行轉換列:  查詢多個欄位下 later view的使用

行轉列中,如果查詢欄位是多個,不僅僅是列轉行的這個字段的話,那麼久要是用到 later view注意later view後要有別名

1    zhangsan    shanghai,beijing

2    lisi    tianjin

3    wangwu    nanjing

create table stu(id string,name string,addr string) row format delimited fields terminated by '\t';

load data local inpath '/home/18511893257/stu' into table stu;

select id, name, addr1  from stu  lateral view explode(split(addr,','))a as addr1; 

ok

1       zhangsan        shanghai

1       zhangsan        beijing

2       lisi    tianjin

3       wangwu  nanjing

4行轉換列:  單錶下寫法

hive如何將

a       b       1

a       b       2

a       b       3

c       d       4

c       d       5

c       d       6

變為:a       b       1,2,3

c       d       4,5,6

from tmp_jiangzl_test  

group by col1,col2;    ----------------》 已經驗證過  ok

Hive 行列轉換

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

Hive中行列轉換

1 演示多列轉為單行 資料檔案及內容 student.txt xiaoming english 92.0 xiaoming chinese 98.0 xiaoming math 89.5 huahua chinese 80.0 huahua math 89.5 建立表studnet create t...

hive行列轉換總結

具體思路需要根據資料來定,常見的解決方法如下 1 使用case when 查詢出多列即可,即可增加列。或者2.轉成陣列或者集合後 乙個乙個的取值 不就變成一列了 乙個字段 多個取值 變成多列 多列變一列 select concat str1,str2,str3 from 表 concat可以帶多個引...