头歌 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 ----------