HiveQL 行列转换样例

列转行

数据文件内容 player.txt

詹姆斯|小皇帝|2003|骑士,热火,湖人|3
保罗|三炮|2005|黄蜂,快船,火箭|0
韦德|闪电侠|2003|热火,骑士,公牛|3
安东尼|甜瓜|2003|掘金,尼克斯,雷霆,火箭|0

需求内容

将选秀年份相同且冠军数量相同的球员姓名用+拼接展示

2003,0|安东尼
2003,3|詹姆斯+韦德
2005,0|保罗

涉及函数解析

  • CONCAT_WS
CONCAT(string A/col, string B/col…):
返回输入字符串连接后的结果,支持任意个输入字符串;  

CONCAT_WS 是一个特殊形式的 CONCAT()()。  
CONCAT_WS(separator, str1, str2,...)
第一个参数剩余参数间的分隔符。
分隔符可以是与剩余参数一样的字符串。
如果分隔符是 NULL,返回值也将为 NULL。
这个函数会跳过分隔符参数后的任何 NULL 和空字符串。
分隔符将被加到被连接的字符串之间;
  • COLLECT_SET
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 ;

拼接字段函数 CONCAT_WS

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  安东尼

完成列转行 COLLECT_SET

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
      ) A
GROUP 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<string>)
explode函数以array类型数据输入,然后对数组中的数据进行迭代,返回多行结果,一行一个数组元素值
ARRAY函数是将一列输入转换成一个数组输出。

Hive的表生成函数只是生成了一种数据的展示方式,
而无法在表中产生一个其他的列。   
因此这块需要使用LATERAL  VIEW 功能来进行处理。
LATERAL VIEW将explode生成的结果当做一个视图来处理。        
  • LATERAL VIEW
# 使用方法
LATERAL VIEW udtf(expression) tableAlias AS columnAlias

# 用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

LATERAL VIEW 会将UDTF生成的结果放到一个虚拟表中  
然后这个虚拟表会和输入行进行join  
来达到连接UDTF外的select字段的目的
  • split
# 使用方法: 
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
      ) B
GROUP BY join_team_name;

--- 查询结果
公牛  1
尼克斯 1
快船  1
掘金  1
湖人  1
火箭  2
热火  2
雷霆  1
骑士  2
黄蜂  1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容