> 技术文档 > 头歌 Hive综合应用案例1——用户学历查询_hive综合应用案例——用户学历查询

头歌 Hive综合应用案例1——用户学历查询_hive综合应用案例——用户学历查询


第1关:查询每一个用户从出生到现在的总天数

任务描述
本关任务:查询出每一个用户从出生到现在\'2025-06-09\'的总天数

编程要求
在右侧编辑器补充hql语句,查询出每一个用户从出生到现在\"2025-06-09\"的总天数。

创建数据库:mydb

创建表:usertab

字段名    类型    注释
id    int    用户id
sex    string    性别,f:女性,m:男性
time    string    出生日期
education    string    学历
occupation    string    职业
income    string    收入
area    string    出生地区
desired_area    string    向往地区
city_countryside    string    城市/农村
部分数据如下:

600,f,1994/02/04,本科,机械工程师,6k,北方,南方,城市
601,f,1993/04/09,本科,Java开发工程师,7k,北方,南方,城市
602,m,1991/05/13,本科,大数据开发工程师,9k,北方,南方,农村
603,m,1996/12/23,本科,大数据开发工程师,9k,南方,东方,城市
604,f,1996/11/24,本科,人工智能开发工程师,10k,南方,东方,农村
数据切分方式:逗号(,)

数据所在目录:/root/data.txt

测试说明
平台会对你编写的代码进行测试:

---------- 禁止修改 ----------drop database if exists mydb cascade;---------- 禁止修改 -------------------- begin -------------创建mydb数据库CREATE DATABASE mydb;---使用mydb数据库USE mydb;---创建表userCREATE TABLE usertab ( id INT, sex STRING, time STRING, education STRING, occupation STRING, income STRING, area STRING, desired_area STRING, city_countryside STRING )ROW FORMAT DELIMITEDFIELDS TERMINATED BY \',\';---导入数据:/root/data.txtLOAD DATA LOCAL INPATH \'/root/data.txt\' INTO TABLE usertab;---查询每一个用户从出生到现在\"2025-06-09\"的总天数SELECT id, DATEDIFF(\'2025-06-09\', TO_DATE(REPLACE(time, \'/\', \'-\'))) AS days_since_birthFROM usertab; 

第2关:同一个地区相同的教育程度的最高收入

任务描述
本关任务:
查询出同一个地区最高收入,
查询出同一个地区相同的教育程度的最高收入。

编程要求
在右侧编辑器补充hql语句,查询出同一个地区最高收入,查询出同一个地区相同的教育程度的最高收入。

创建数据库:mydb

创建表:usertab1

字段名    类型    注释
Id    Int    用户id
Sex    String    性别,f:女性,m:男性
Time    String    出生日期
Education    String    学历
Occupation    String    职业
Income    int    收入
Area    String    出生地区
Desired_area    String    向往地区
City_Countryside    String    城市/农村
部分数据如下:

600,f,1994/02/04,本科,机械工程师,6000,北方,南方,城市
601,f,1993/04/09,本科,Java开发工程师,7000,北方,南方,城市
602,m,1991/05/13,本科,大数据开发工程师,9000,北方,南方,农村
数据切分方式:逗号(,)

数据所在目录:/root/data1.txt

测试说明
平台会对你编写的代码进行测试:

---------- 禁止修改 ---------- drop database if exists mydb cascade;---------- 禁止修改 -------------------- begin -------------创建mydb数据库CREATE DATABASE mydb;---使用mydb数据库USE mydb;---创建表userCREATE TABLE usertab1 ( id INT, sex STRING, time STRING, education STRING, occupation STRING, income STRING, area STRING, desired_area STRING, city_countryside STRING )ROW FORMAT DELIMITEDFIELDS TERMINATED BY \',\';---导入数据:/root/data.txtLOAD DATA LOCAL INPATH \'/root/data1.txt\' INTO TABLE usertab1;--同一个地区最高收入SELECT area, MAX(CAST(income AS INT)) AS max_incomeFROM usertab1GROUP BY area;--同一个地区相同的教育程度的最高收入SELECT area, education, MAX(CAST(income AS INT)) AS max_incomeFROM usertab1GROUP BY area, education;---------- end ----------

第3关:查询每个学历的用户数量

任务描述
本关任务:查询查询每个学历的用户数量。

编程要求
在右侧编辑器中补充代码,查询出查询每个学历的用户数量。

创建数据库:mydb

创建表:usertab2

字段名    类型    注释
id    int    用户id
sex    string    性别f:女性;m:男性
time    string    出生日期
education    string    学历
occupation    string    职业
income    string    收入
area    string    出生地区
desired_area    string    向往地区
city_countryside    string    城市/农村
部分数据如下:

600,f,1994/02/04,本科,机械工程师,6k,北方,南方,城市
601,f,1993/04/09,本科,Java开发工程师,7k,北方,南方,城市
602,m,1991/05/13,本科,大数据开发工程师,9k,北方,南方,农村
603,m,1996/12/23,本科,大数据开发工程师,9k,南方,东方,城市
604,f,1996/11/24,本科,人工智能开发工程师,10k,南方,东方,农村
数据切分方式:逗号(,)

数据所在目录:/root/data.txt

测试说明
平台会对你编写的代码进行测试:

---------- 禁止修改 ---------- drop database if exists mydb cascade;---------- 禁止修改 -------------------- begin --------------创建mydb数据库CREATE DATABASE mydb;---使用mydb数据库USE mydb;---创建表userCREATE TABLE usertab2 ( id INT, sex STRING, time STRING, education STRING, occupation STRING, income STRING, area STRING, desired_area STRING, city_countryside STRING )ROW FORMAT DELIMITEDFIELDS TERMINATED BY \',\';---导入数据:/root/data.txtLOAD DATA LOCAL INPATH \'/root/data.txt\' INTO TABLE usertab2;SELECT education, COUNT(*) AS user_countFROM usertab2GROUP BY education;---------- end ----------

第4关: 统计各级学历所占总人数百分比

任务描述
本关任务:查询出各级学历所占总人数百分比。

编程要求
在右侧编辑器中补充代码,查询出各级学历所占总人数百分比。(对结果保留两位小数,并对学历升序输出)

创建数据库:mydb

创建表:usertab2

字段名    类型    注释
id    int    用户id
sex    string    性别f:女性;m:男性
time    string    出生日期
education    string    学历
occupation    string    职业
income    string    收入
area    string    出生地区
desired_area    string    向往地区
city_countryside    string    城市/农村
部分数据如下:

600,f,1994/02/04,本科,机械工程师,6k,北方,南方,城市
601,f,1993/04/09,本科,Java开发工程师,7k,北方,南方,城市
602,m,1991/05/13,本科,大数据开发工程师,9k,北方,南方,农村
603,m,1996/12/23,本科,大数据开发工程师,9k,南方,东方,城市
604,f,1996/11/24,本科,人工智能开发工程师,10k,南方,东方,农村
数据切分方式:逗号(,)

数据所在目录:/root/data.txt

测试说明
平台会对你编写的代码进行测试:

预期输出:

27.27%    专科
45.45%    本科
27.27%    硕士

---------- 禁止修改 ----------drop database if exists mydb cascade;set hive.mapred.mode=nonstrict;---------- 禁止修改 -------------------- begin --------------创建mydb数据库CREATE DATABASE mydb;---使用mydb数据库USE mydb;---创建表userCREATE TABLE usertab2 ( id INT, sex STRING, time STRING, education STRING, occupation STRING, income STRING, area STRING, desired_area STRING, city_countryside STRING )ROW FORMAT DELIMITEDFIELDS TERMINATED BY \',\';---导入数据:/root/data.txtLOAD DATA LOCAL INPATH \'/root/data.txt\' INTO TABLE usertab2;--查询SELECT CONCAT(ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2), \'%\') AS percentage, educationFROM usertab2GROUP BY educationORDER BY education;---------- end ---------- 

第5关:查询每个学历的男女收入差距

任务描述
本关任务:查询出各级学历所占总人数百分比。

编程要求
在右侧编辑器中补充代码,查询每个职业的男性平均收入和女性平均收入,并显示对应的职业的男女收入差距。

创建数据库:mydb

创建表:usertab2

字段名    类型    注释
id    int    用户id
sex    string    性别f:女性;m:男性
time    string    出生日期
education    string    学历
occupation    string    职业
income    string    收入
area    string    出生地区
desired_area    string    向往地区
city_countryside    string    城市/农村
部分数据如下:

600,f,1994/02/04,本科,机械工程师,6k,北方,南方,城市
601,f,1993/04/09,本科,Java开发工程师,7k,北方,南方,城市
602,m,1991/05/13,本科,大数据开发工程师,9k,北方,南方,农村
603,m,1996/12/23,本科,大数据开发工程师,9k,南方,东方,城市
604,f,1996/11/24,本科,人工智能开发工程师,10k,南方,东方,农村
数据切分方式:逗号(,)

数据所在目录:/root/data1.txt

测试说明
平台会对你编写的代码进行测试:

---------- 禁止修改 ---------- drop database if exists mydb cascade;---------- 禁止修改 -------------------- begin --------------创建mydb数据库CREATE DATABASE mydb;---使用mydb数据库USE mydb;---创建表userCREATE TABLE usertab2 ( id INT, sex STRING, time STRING, education STRING, occupation STRING, income STRING, area STRING, desired_area STRING, city_countryside STRING )ROW FORMAT DELIMITEDFIELDS TERMINATED BY \',\';---导入数据:/root/data.txtLOAD DATA LOCAL INPATH \'/root/data1.txt\' INTO TABLE usertab2;--查询每个学历的男女收入差距SELECT occupation, male_avg_income, female_avg_income, (male_avg_income - female_avg_income) AS income_gapFROM ( SELECT occupation, AVG(CASE WHEN sex = \'m\' THEN CAST(income AS DOUBLE) ELSE NULL END) AS male_avg_income, AVG(CASE WHEN sex = \'f\' THEN CAST(income AS DOUBLE) ELSE NULL END) AS female_avg_income FROM usertab2 WHERE income != \'NULL\' GROUP BY occupation) subqueryORDER BY occupation;---------- end ----------

第6关:查询每个城市的学历分布

任务描述
本关任务:查询每个城市的学历分布,包括不同学历的人数,并显示对应的城市和学历分布。

编程要求
在右侧编辑器中补充代码,查询每个城市的学历分布,包括不同学历的人数,并显示对应的城市和学历分布。

创建数据库:mydb

创建表:usertab2

字段名    类型    注释
id    int    用户id
sex    string    性别f:女性;m:男性
time    string    出生日期
education    string    学历
occupation    string    职业
income    string    收入
area    string    出生地区
desired_area    string    向往地区
city_countryside    string    城市/农村
部分数据如下:

600,f,1994/02/04,本科,机械工程师,6k,北方,南方,城市
601,f,1993/04/09,本科,Java开发工程师,7k,北方,南方,城市
602,m,1991/05/13,本科,大数据开发工程师,9k,北方,南方,农村
603,m,1996/12/23,本科,大数据开发工程师,9k,南方,东方,城市
604,f,1996/11/24,本科,人工智能开发工程师,10k,南方,东方,农村
数据切分方式:逗号(,)

数据所在目录:/root/data1.txt

测试说明
平台会对你编写的代码进行测试:

---------- 禁止修改 ---------- drop database if exists mydb cascade;---------- 禁止修改 -------------------- begin --------------创建mydb数据库CREATE DATABASE mydb;---使用mydb数据库USE mydb;---创建表userCREATE TABLE usertab2 ( id INT, sex STRING, time STRING, education STRING, occupation STRING, income STRING, area STRING, desired_area STRING, city_countryside STRING )ROW FORMAT DELIMITEDFIELDS TERMINATED BY \',\';---导入数据:/root/data.txtLOAD DATA LOCAL INPATH \'/root/data1.txt\' INTO TABLE usertab2;--查询SELECT area AS city, education, COUNT(*) AS num_peopleFROM usertab2GROUP BY area, education;---------- end ----------