专栏首页Jed的技术阶梯Hive案例01-行列转换

Hive案例01-行列转换

介绍Hive查询中的行列转换的用法

1. 案例一:求数学成绩比语文成绩好的学生的ID

(1) 需求分析

现有 hive 表 score, 内容如下:

hive> select * from score;
1   1   yuwen   43
2   1   shuxue  55
3   2   yuwen   77
4   2   shuxue  88
5   3   yuwen   98
6   3   shuxue  65

其中字段意义: id(int) sid(int) subject(string) score(int) 分别代表: 本条记录的ID 学生ID 科目 成绩 需求: 求数学成绩比语文成绩好的学生的ID

(2) 方法一(join)

SELECT s1.sid FROM score s1 INNER JOIN score s2
ON s1.sid = s2.sid 
AND s1.score > s2.score
AND s1.subject = 'shuxue'
AND s2.subject = 'yuwen';

# 结果
1
2

(3) 方法二(行列转换)

思路:

--(1)
CREATE TABLE t1 AS
SELECT sid, 
CASE subject WHEN 'yuwen' THEN score END AS yuwen, 
CASE subject WHEN 'shuxue' THEN score END AS shuxue 
FROM score;

t1中的数据:
1   43      NULL
1   NULL    55
2   77      NULL
2   NULL    88
3   98      NULL
3   NULL    65

--(2)
CREATE TABLE t2 AS
SELECT sid, max(yuwen) yuwen, max(shuxue) shuxue 
FROM t1
GROUP BY sid;

t2中的数据:
1   43  55
2   77  88
3   98  65

--(3)
SELECT sid FROM t2 WHERE shuxue > yuwen;

结果:
1
2

2.案例二:销售表的行列转换

(1) 需求

现有hive表sales,内容如下:

hive> select * from sales;
sales.y sales.season    sales.sale
1991        1               11
1991        2               12
1991        3               13
1991        4               14
1992        1               21
1992        2               22
1992        3               23
1992        4               24

各字段分别代表: y 年份 season 季度 sale 销售量 要求:在一行中显示每年每个季度的销售量

(2)实现

SELECT
    tmp.y,
    max(tmp.season1) season1,
    max(tmp.season2) season2,
    max(tmp.season3) season3,
    max(tmp.season4) season4
FROM (SELECT y,
        CASE season WHEN 1 THEN sale END AS season1,
        CASE season WHEN 2 THEN sale END AS season2,
        CASE season WHEN 3 THEN sale END AS season3,
        CASE season WHEN 4 THEN sale END AS season4
        FROM sales) tmp
GROUP BY tmp.y;

结果:
tmp.y   season1 season2 season3 season4
1991    11      12      13      14
1992    21      22      23      24

3. 案例三:学生成绩表的列转行

(1) 需求

有如下学生成绩表score:

id  sname   math    computer    english
1   Jed     34      58          58
2   Tony    45      87          45
3   Tom     76      34          89

请编写一个SQL语句把以上的这张表转换成下面这张表:

id  sname   course      score
1   Jed     computer    58
1   Jed     english     58
1   Jed     math        34
2   Tony    computer    87
2   Tony    english     45
2   Tony    math        45
3   Tom     computer    34
3   Tom     english     89
3   Tom     math        76

(2) 实现

select id, sname, 'math' as course, math as score from score
union 
select id, sname, 'computer' as course, computer as score from score
union 
select id, sname, 'english' as course, english as score from score
order by id, sname, course;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HBase Region 自动拆分策略

    其中BusyRegionSplitPolicy是HBase-2.x新增的策略,其他6种在HBase-1.2.x中也可以使用。

    CoderJed
  • Spark-RDD持久化

    使用不同参数的组合构造的实例被预先定义为一些值,比如MEMORY_ONLY代表着不存入磁盘,存入内存,不使用堆外内存,不进行序列化,副本数为1,使用persis...

    CoderJed
  • Kafka 消费者旧版低级 API

    Kafka 消费者总共有 3 种 API,新版 API、旧版高级 API、旧版低级 API,新版 API 是在 kafka 0.9 版本后增加的,推荐使用新版 ...

    CoderJed
  • Day10面向对象高级编程1/3

    使用slots 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。 class...

    林清猫耳
  • Elasticsearch:使用 function_score 及 soft_score 定制搜索结果的分数

    我们将介绍使用 function_score 的基础知识,并介绍一些 function core 技术非常有用和有效的用例。

    腾讯云ES团队
  • python判断成绩给等级

    py3study
  • 使用@property

    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a0...

    bear_fish
  • 如何用 Python 将 Excel 表格转成可视化图形?

    大家知道,考研很大一部分也是考信息收集能力。每年往往有很多人就是在这上面栽跟头了,不能正确分析各大院校往年的录取信息,进而没能选择合适的报考院校。

    Python进击者
  • python 面向对象技巧 @property

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

    葫芦
  • “猜你喜欢”的背后揭秘——我偷偷知道你喜欢什么哟

    话说,最近的瓜实在有点多,从我科校友李雨桐怒锤某男、陈羽凡吸毒被捕、蒋劲夫家暴的三连瓜,到不知知网翟博士,再到邓紫棋解约蜂鸟、王思聪花千芳隔空互怼。

    用户1621951

扫码关注云+社区

领取腾讯云代金券