HiveQL 行列轉換樣例

2021-10-05 11:35:35 字數 3632 閱讀 9860

詹姆斯|小皇帝|2003|騎士,熱火,湖人|3

保羅|三炮|2005|黃蜂,快船,火箭|0

韋德|閃電俠|2003|熱火,騎士,公牛|3

安東尼|甜瓜|2003|掘金,尼克斯,雷霆,火箭|0

將選秀年份相同且冠軍數量相同的球員姓名用+拼接展示

2003,0|安東尼

2003,3|詹姆斯+韋德

2005,0|保羅

concat(string a/col, string b/col…):

返回輸入字串連線後的結果,支援任意個輸入字串;

concat_ws 是乙個特殊形式的 concat()()。

concat_ws(separator, str1, str2,...)

第乙個引數剩餘引數間的分隔符。

分隔符可以是與剩餘引數一樣的字串。

如果分隔符是 null,返回值也將為 null。

這個函式會跳過分隔符引數後的任何 null 和空字串。

分隔符將被加到被連線的字串之間;

collect_set(col):

函式只接受基本資料型別,

它的主要作用是將某字段的值進行去重彙總,

產生array型別字段。

create table nba_player(

player_name string comment "球員姓名",

nickname string comment "外號",

begin_year varchar(4) comment "選秀年份",

join_team string comment "效力過的球隊",

champion_count int comment "總冠軍次數"

)row format delimited fields terminated by "|";

load data local inpath '/home/hadoop/player.txt' 

overwrite into table nba_player ;

select concat_ws(",",begin_year,cast(champion_count as string)) group_info,player_name 

from nba_player;

-- 查詢結果

2003,3 詹姆斯

2005,0 保羅

2003,3 韋德

2003,0 安東尼

select  a.group_info,

concat_ws("+",collect_set(a.player_name))

from (

select concat_ws(",",begin_year,cast(champion_count as string)) group_info,

player_name

from nba_player

) agroup by a.group_info;

-- 查詢結果

2003,0 安東尼

2003,3 詹姆斯+韋德

2005,0 保羅

簡單例子:把選秀年份相同球員找到並放到一起+分割展示

select  begin_year,

concat_ws("+",collect_set(player_name))

from nba_player

group by begin_year;

-- 查詢結果

2003 詹姆斯+韋德+安東尼

2005 保羅

統計每個球隊效力過球員人數

explode函式以array型別資料輸入,然後對陣列中的資料進行迭代,返回多行結果,一行乙個陣列元素值

array函式是將一列輸入轉換成乙個陣列輸出。

hive的表生成函式只是生成了一種資料的展示方式,

而無法在表中產生乙個其他的列。

因此這塊需要使用lateral view 功能來進行處理。

lateral view將explode生成的結果當做乙個檢視來處理。

# 使用方法

lateral view udtf(expression) tablealias as columnalias

# 用於和split, explode等udtf一起使用,它能夠將一列資料拆成多行資料,在此基礎上可以對拆分後的資料進行聚合。

lateral view 會將udtf生成的結果放到乙個虛擬表中

然後這個虛擬表會和輸入行進行join

來達到連線udtf外的select欄位的目的

# 使用方法: 

split(string str, string pat)

返回值: array

按照pat字串分割str,會返回分割後的字串數,

正規表示式中的特殊符號作為分隔符時,需做轉義 (字首加上\)

select player_name,

join_team_name

from (

select player_name,

split(join_team,",") as array_join_team

from nba_player

) a

lateral view explode(array_join_team) tmptable as join_team_name;

--- 查詢結果

詹姆斯 騎士

詹姆斯 熱火

詹姆斯 湖人

保羅 黃蜂

保羅 快船

保羅 火箭

韋德 熱火

韋德 騎士

韋德 公牛

安東尼 掘金

安東尼 尼克斯

安東尼 雷霆

安東尼 火箭

select join_team_name ,

count(*)

from (

select player_name,

join_team_name

from (

select player_name,

split(join_team,",") as array_join_team

from nba_player

) a

lateral view explode(array_join_team) tmptable as join_team_name

) bgroup by join_team_name;

--- 查詢結果

公牛 1

尼克斯 1

快船 1

掘金 1

湖人 1

火箭 2

熱火 2

雷霆 1

騎士 2

黃蜂 1

mysql行列轉換 mysql行列轉換

1.一維轉二維 上圖為成績表中資料,現希望將資料轉換為下圖。靜態 轉化為二維表後的列名及列數是確定不變的,本例中即course只有數學 語文 英語這三門課。select s name,max if course 數學 score,0 as 數學,max if course 語文 score,0 as...

mysql行列轉換例子 mysql行列轉換示例

現把轉換方法列舉如下 1 縱表轉橫表 縱表結構 tablea name course grade 張三語文 張三數學 張三英語 李四語文 李四數學 橫表結構 tableb name 語文數學 英語張三 李四方法一 select name,sum case course when 語文 then gr...

行列轉換 普通

行列轉換 普通 if exists select from sysobjects where id object id a and sysstat 0xf 3 drop table dbo.a create table dbo.a name1 varchar 20 not null,subject ...