介绍
该文为Hadoop基础实验中的hive实验
实验目的:
掌握hive的编程技术
实验步骤:
1、创建数据库stu。
2、创建students表,表结构如下:
id int,
name string,
gender string,
age int,
course_id int,
score double,
classes string
3、导入数据students_data.txt到students表。
4、创建course表,表结构如下:
course_id int,
course_name string
5、导入数据course.txt到course表。
6、创建动态分区表students_dynamic,以classes为分区字段。
7、从students表导入数据到students_dynamic。
8、查询每个班的平均分数。
9、查询students表中所有学生的姓名、分数。
10、查询students表中成绩在80至90之间的记录的所有信息。
11、查询students表中成绩在60以下的记录的姓名、课程编号(course_id)和分数。
12、将students表中的所有记录先按分数降序,当分数一样时,再按姓名升序排列。
13、统计students表中有多少门不同的课程。
14、查询Mary所选修课程的课程编号和分数。
15、找出所有学生中,course_id为30的课程,分数最高的同学。输出该同学姓名、分数、课程名称、所在班级到屏幕。
实验方案
打开hive( 在hadoop根目录执行)
start-dfs.sh
该语句为打开hdfs分布式文件系统,运行结果如下:
start-yarn.sh
该语句为打开资源调度框架yarn,运行结果如下:
service mysqld start
该语句为打开mysql数据库,运行结果如下:
hive
该语句为打开hive,运行结果如下:
由于hive是部署在hdfs上的组件,故打开hive之前要打开hdfs和yarn框架来调度资源,而hive产生的元数据存储在mysql中,故打开hdfs和yarn之后,且在打开hive之前要打开mysql。
create database stu;
该语句为创建名为stu的数据库,运行结果如下:
use stu;
该语句为使用数据库stu,运行结果如下:
create table students(id int,name string,gender string,age int,course_id int,score double,classes string) row format delimited fields terminated by ',';
创建名为students的表格,运行结果如下:
load data local inpath '/simple/data/students_data.txt' overwrite into table students;
从本地加载数据到表students中,运行结果如下:
hive> create table course(course_id int,course_name string) row format delimited fields terminated by ',';
创建名为course的表,运行结果如下:
load data local inpath '/simple/data/course.txt' overwrite into table course;
从本地加载数据到表course中,运行结果如下:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;
创建动态分区表之前要先开启分区,运行结果如下:
create table students_dynamic(id int,name string,gender string,age int,course_id int,score double,classes string) partitioned by(class string) row format delimited fields terminated by ',';
创建动态分区表,运行结果如下:
7.
insert overwrite table students_dynamic partition(class='classA')select * from students;
在数据库stu中动态分区表students_dynamic中插入表students的数据,运行结果如下:
select classes,avg(score) from students group by classes;
查询每个班的平均分数,运行结果如下:
select name,score from students;
查询students表中所有学生的姓名、分数,运行结果如下:
select * from students where score>=80 and score<=90;
查询students表中成绩在80至90之间的记录的所有信息,运行结果如下:
select name,course_id,score from students where score<60;
查询students表中成绩在60以下的记录的姓名、课程编号(course_id)和分数,查询结果如下:
select * from students order by score desc,name asc;
将students表中的所有记录先按分数降序,当分数一样时,再按姓名升序排列,运行结果如下:
select count
(distinct course_id) from students;
select course_id,score from students where name=='Mary';
查询Mary所选修课程的课程编号和分数,运行结果如下:
select name,score,course_id,classes from students a,(select max(score) max_score from students where course_id=30) b where a.score=b.max_score and course_id=30;
找出所有学生中,course_id为30的课程,分数最高的同学。输出该同学姓名、分数、 课程名称、所在班级到屏幕,运行结果如下: