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:
3 行轉換列: 查詢多個欄位下 later view的使用一、問題
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;
行轉列中,如果查詢欄位是多個,不僅僅是列轉行的這個字段的話,那麼久要是用到 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可以帶多個引...