HIVE:分科求平均分

一、实战概述

  • 在这个实战中,我们使用了Hive框架来处理学生的月考成绩数据。首先,我们准备了三个文本文件,分别包含了语文、数学和英语的月考成绩数据。这些数据被上传到HDFS的指定目录。

  • 接着,我们启动了Hive Metastore服务,并通过Hive客户端连接到Hive。在Hive中,我们创建了一个分区表student_score,用于存储学生的成绩数据,其中分区字段为科目(subject)。

  • 然后,我们按照科目将数据加载到分区表中,分别加载了语文、数学和英语的成绩数据。通过这样的分区方式,我们能够更方便地对数据进行查询和分析。

  • 最后,我们使用Hive的SQL语句进行统计,计算每个学生在三个科目上的月考平均分。使用了AVG函数和ROUND函数来得到每个学生的平均分,并保留一位小数。这样,我们得到了每个学生在语文、数学和英语三个科目上的月考平均分的统计结果。

  • 整个实战过程涉及了Hive的表创建、分区管理、数据加载和SQL查询等操作,展示了Hive在大数据处理中的灵活性和便捷性。通过这次实战,我们能够更好地理解和掌握Hive框架在数据分析和查询中的应用。

二、提出任务

  • 语文月考成绩 - chinese.txt
1 张晓云 89
2 张晓云 73
3 张晓云 67
4 张晓云 70
5 张晓云 79
6 张晓云 87
7 张晓云 99
8 张晓云 83
9 张晓云 97
10 张晓云 92
11 张晓云 67
12 张晓云 86
1 王东林 49
2 王东林 83
3 王东林 67
4 王东林 49
5 王东林 93
6 王东林 87
7 王东林 65
8 王东林 92
9 王东林 60
10 王东林 94
11 王东林 81
12 王东林 90
1 李宏宇 77
2 李宏宇 66
3 李宏宇 89
4 李宏宇 87
5 李宏宇 96
6 李宏宇 79
7 李宏宇 87
8 李宏宇 96
9 李宏宇 69
10 李宏宇 87
11 李宏宇 96
12 李宏宇 79


  • 数学月考成绩 - math.txt
在这1 张晓云 79
2 张晓云 83
3 张晓云 77
4 张晓云 90
5 张晓云 89
6 张晓云 67
7 张晓云 89
8 张晓云 93
9 张晓云 90
10 张晓云 82
11 张晓云 77
12 张晓云 96
1 王东林 78
2 王东林 94
3 王东林 76
4 王东林 70
5 王东林 90
6 王东林 83
7 王东林 85
8 王东林 82
9 王东林 84
10 王东林 78
11 王东林 99
12 王东林 93
1 李宏宇 86
2 李宏宇 81
3 李宏宇 76
4 李宏宇 93
5 李宏宇 88
6 李宏宇 82
7 李宏宇 81
8 李宏宇 93
9 李宏宇 86
10 李宏宇 90
11 李宏宇 67
12 李宏宇 88


  • 英语月考成绩 - english.txt
1 张晓云 78
2 张晓云 83
3 张晓云 92
4 张晓云 66
5 张晓云 82
6 张晓云 89
7 张晓云 79
8 张晓云 68
9 张晓云 96
10 张晓云 91
11 张晓云 87
12 张晓云 82
1 王东林 69
2 王东林 86
3 王东林 73
4 王东林 99
5 王东林 67
6 王东林 95
7 王东林 74
8 王东林 92
9 王东林 76
10 王东林 88
11 王东林 92
12 王东林 56
1 李宏宇 88
2 李宏宇 78
3 李宏宇 92
4 李宏宇 78
5 李宏宇 89
6 李宏宇 76
7 李宏宇 92
8 李宏宇 75
9 李宏宇 88
10 李宏宇 92
11 李宏宇 97
12 李宏宇 85


  • 利用Hive框架,统计每个同学各科月考平均分
    在这里插入图片描述

三、完成任务

(一)准备数据

1、在虚拟机上创建文本文件

  • 在master虚拟机上创建chinese.txt文件
    在这里插入图片描述
  • 创建math.txt文件
    在这里插入图片描述
  • 创建english.txt文件
    在这里插入图片描述

2、上传文件到HDFS指定目录

  • 创建/subjectavg/input目录,执行命令:hdfs dfs -mkdir -p /subjectavg/input
  • 将文本文件chinese.txt、math.txt与english.txt,上传到HDFS的/subjectavg/input
    在这里插入图片描述

(二)实现步骤

1、启动Hive Metastore服务

  • 执行命令:hive --service metastore &,在后台启动metastore服务
    在这里插入图片描述

2、启动Hive客户端

  • 执行命令:hive,看到命令提示符hive>
    在这里插入图片描述

3、创建分区的学生成绩表

  • 执行语句:CREATE TABLE student_score ( id INT, name STRING, score INT ) PARTITIONED BY (subject STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ’ ';

4、按分区加载数据

  • 加载chinese.txt到chinese分区
    在这里插入图片描述LOAD DATA INPATH ‘/subjectavg/input/chinese.txt’ OVERWRITE INTO TABLE student_score PARTITION(subject = ‘chinese’); Loading data to table default.student_score partition (subject=chinese)

  • 加载math.txt到math分区
    在这里插入图片描述
    LOAD DATA INPATH ‘/subjectavg/input/math.txt’ OVERWRITE INTO TABLE student_score PARTITION(subject = ‘math’); Loading data to table default.student_score partition (subject=math)

  • 加载english.txt到english分区
    在这里插入图片描述
    LOAD DATA INPATH ‘/subjectavg/input/english.txt’ OVERWRITE INTO TABLE student_score PARTITION(subject = ‘english’); Loading data to table default.student_score partition (subject=english)

5、查看分区表全部记录

在这里插入图片描述

  • 执行语句:SELECT * FROM student_score;
    在这里插入图片描述
1       张晓云  89      chinese
2       张晓云  73      chinese
3       张晓云  67      chinese
4       张晓云  70      chinese
5       张晓云  79      chinese
6       张晓云  87      chinese
7       张晓云  99      chinese
8       张晓云  83      chinese
9       张晓云  97      chinese
10      张晓云  92      chinese
11      张晓云  67      chinese
12      张晓云  86      chinese
1       王东林  49      chinese
2       王东林  83      chinese
3       王东林  67      chinese
4       王东林  49      chinese
5       王东林  93      chinese
6       王东林  87      chinese
7       王东林  65      chinese
8       王东林  92      chinese
9       王东林  60      chinese
10      王东林  94      chinese
11      王东林  81      chinese
12      王东林  90      chinese
1       李宏宇  77      chinese
2       李宏宇  66      chinese
3       李宏宇  89      chinese
4       李宏宇  87      chinese
5       李宏宇  96      chinese
6       李宏宇  79      chinese
7       李宏宇  87      chinese
8       李宏宇  96      chinese
9       李宏宇  69      chinese
10      李宏宇  87      chinese
11      李宏宇  96      chinese
12      李宏宇  79      chinese
1       张晓云  78      english
2       张晓云  83      english
3       张晓云  92      english
4       张晓云  66      english
5       张晓云  82      english
6       张晓云  89      english
7       张晓云  79      english
8       张晓云  68      english
9       张晓云  96      english
10      张晓云  91      english
11      张晓云  87      english
12      张晓云  82      english
1       王东林  69      english
2       王东林  86      english
3       王东林  73      english
4       王东林  99      english
5       王东林  67      english
6       王东林  95      english
7       王东林  74      english
8       王东林  92      english
9       王东林  76      english
10      王东林  88      english
11      王东林  92      english
12      王东林  56      english
1       李宏宇  88      english
2       李宏宇  78      english
3       李宏宇  92      english
4       李宏宇  78      english
5       李宏宇  89      english
6       李宏宇  76      english
7       李宏宇  92      english
8       李宏宇  75      english
9       李宏宇  88      english
10      李宏宇  92      english
11      李宏宇  97      english
12      李宏宇  85      english
1       张晓云  79      math
2       张晓云  83      math
3       张晓云  77      math
4       张晓云  90      math
5       张晓云  89      math
6       张晓云  67      math
7       张晓云  89      math
8       张晓云  93      math
9       张晓云  90      math
10      张晓云  82      math
11      张晓云  77      math
12      张晓云  96      math
1       王东林  78      math
2       王东林  94      math
3       王东林  76      math
4       王东林  70      math
5       王东林  90      math
6       王东林  83      math
7       王东林  85      math
8       王东林  82      math
9       王东林  84      math
10      王东林  78      math
11      王东林  99      math
12      王东林  93      math
1       李宏宇  86      math
2       李宏宇  81      math
3       李宏宇  76      math
4       李宏宇  93      math
5       李宏宇  88      math
6       李宏宇  82      math
7       李宏宇  81      math
8       李宏宇  93      math
9       李宏宇  86      math
10      李宏宇  90      math
11      李宏宇  67      math
12      李宏宇  88      math


6、按姓名和科目分组汇总平均分

  • 执行语句:SELECT name, subject, ROUND(AVG(score), 1) AS average_score FROM student_score GROUP BY name, subject;

在这里插入图片描述

  • 每个学生三科平均分倒是统计出进来了,但是格式我们并不满意,我们希望每个学生的三科平均分不是分占三行,而是在一行里显示三科平均分。

7、统计每个学生三科月考平均分

  • 执行语句:SELECT name, ROUND(AVG(CASE WHEN subject = ‘chinese’ THEN score ELSE NULL END), 1) AS chinese_avg, ROUND(AVG(CASE WHEN subject = ‘math’ THEN score ELSE NULL END), 1) AS math_avg, ROUND(AVG(CASE WHEN subject = ‘english’ THEN score ELSE NULL END), 1) AS english_avg FROM student_score GROUP BY name;

在这里插入图片描述

  • 这个SQL查询语句用于从一个名为student_score的表中检索学生的平均分数,并按学生姓名进行分组。以下是查询的解释说明:

四、实战总结

SELECT子句

name: 选择学生的姓名。
ROUND(AVG(CASE WHEN subject = ‘chinese’ THEN score ELSE NULL END), 1) AS chinese_avg: 计算学生在"chinese"科目的平均分数,并将结果四舍五入到一位小数。使用CASE语句,只有当科目是"chinese"时才考虑该分数,否则将其视为NULL。
ROUND(AVG(CASE WHEN subject = ‘math’ THEN score ELSE NULL END), 1) AS math_avg: 计算学生在"math"科目的平均分数,同样将结果四舍五入到一位小数。
ROUND(AVG(CASE WHEN subject = ‘english’ THEN score ELSE NULL END), 1) AS english_avg: 计算学生在"english"科目的平均分数,同样将结果四舍五入到一位小数。
FROM子句

student_score: 表示数据来自名为- -student_score的表。
GROUP BY子句

GROUP BY name: 将结果按学生姓名进行分组,以便计算每个学生在不同科目上的平均分数。

因此,这个查询将返回一个结果集,其中包含每个学生的姓名以及他们在"chinese"、"math"和"english"科目上的平均分数,四舍五入到一位小数。

四、实战总结

本次实战运用Hive处理学生月考成绩数据,通过创建分区表、加载各科目成绩至对应分区,并使用SQL语句计算平均分,展示了Hive在大数据管理、分析查询及统计计算上的灵活性与便捷性。
  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值