Hive|ESport_Earnings文件在Hive的简单查询

资料准备:https://wwyl.lanzoum.com/iGafu0tzw4cd

图片

一、创建一个新的文件夹

1
hadoop fs -mkdir /hadoop_class/hive_game

二、将student文档从本地上传到hadoop

1
hadoop fs -copyFromLocal ~/ESport_Earnings.csv /hadoop_class/hive_game

三、在hive里面创建表

1
2
3
4
create external table game (IdNo int,TotalMoney double,GameName string,Genre string,PlayerNo int,TournamentNo int,Top_Country string,Top_Country_Earnings double,Releaseyear int)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
location '/hadoop_class/hive_game';

针对表中“Taiwan, Republic of China”等地区含有逗号的情况,用hive的OpenCSVSerde解决。
OpenCSVSerde 默认的分隔符(separator)、quote 以及逃逸字符(escape characters )分别为 \、” 以及 ‘。这个可以解决我们读写 CSV 的需求。
其中,stored as textfile表示数据以文本文件的形式进行存储,而row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'则表示表的每一行数据采用的序列化/反序列化工具为OpenCSVSerde,即可以处理CSV格式的工具。

四、跳过第一行数据

1
2
alter table game set TBLPROPERTIES("skip.header.line.count"="1");
#因为第一行有表头 会影响数据

五、计算

a.查询 什么游戏奖金多?

1
2
3
4
SELECT GameName, TotalMoney
FROM game
ORDER BY TotalMoney DESC
LIMIT 1;

这将返回一个包含最高奖金游戏名称和金额的行,并按降序排序的结果,LIMIT 1 确保只返回最高奖金游戏的一行。

图片

b.哪个国家是电竞大国,获得奖金最多。

1
2
3
4
5
SELECT Top_Country, SUM(Top_Country_Earnings) AS TotalEarnings
FROM game
GROUP BY Top_Country
ORDER BY TotalEarnings DESC
LIMIT 10;

图片

c.哪个国家人均获得奖金最多

1
2
3
4
5
6
SELECT Top_Country,
SUM(Top_Country_Earnings)/SUM(PlayerNo) as Avg_Earnings_Per_Player
FROM game
GROUP BY Top_Country
ORDER BY Avg_Earnings_Per_Player DESC
LIMIT 10;

图片

d.计算策略类(Strategy)游戏的趋势,每年增长率

这里计算的是TotalMoney的增长率,其他大同小异

1
2
3
4
5
6
7
8
9
10
11
12
13
#创建一个新表
CREATE TABLE game_strategy_yearly AS
SELECT
ReleaseYear,
SUM(TotalMoney) AS TotalMoneySum
FROM game
WHERE Genre = 'Strategy'
GROUP BY ReleaseYear;

SELECT t2.ReleaseYear,(t1.TotalMoneySum-t2.TotalMoneySum)/t2.TotalMoneySum
FROM game_strategy_yearly t1,game_strategy_yearly t2
WHERE t1.ReleaseYear = t2.ReleaseYear-1;

相对增长率
相对增长率是指指标在一定时间内的变化量占原始数值的百分比。计算公式为
相对增长率=(数值-原始数值)/原始数值×100%

图片

e.计算最近一年,什么游戏增长率最强劲

一个游戏只有一年的数据…… 如果按类型划分的话

TotalMoney的增长率如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TEMPORARY

CREATE TABLE Year_2020 AS
SELECT Genre,sum (TotalMoney) AS TotalMoneySum2020
FROM game
WHERE ReleaseYear = '2020'
GROUP BY Genre;

CREATE TABLE Year_2019 AS
SELECT Genre,sum (TotalMoney) AS TotalMoneySum2019
FROM game
WHERE ReleaseYear = '2019'
GROUP BY Genre;

SELECT t1.Genre,(t1.TotalMoneySum2020-t2.TotalMoneySum2019)/t2.TotalMoneySum2019 AS pre
FROM Year_2020 t1,Year_2019 t2
WHERE t1.Genre = t2.Genre
ORDER BY pre DESC;

图片