Hive:数据查询(9.sql练习)

文章目录

  • 1.练习1
    • 1.1 建表
    • 1.2 思路1
    • 1.3 思路2
  • 2.练习2
    • 2.1 建表
    • 2.2 思路1
  • 3.练习3
    • 3.1 建表
    • 3.2 需求
  • 4.练习4
    • 4.1 数据
    • 4.2 建表
    • 4.3 需求

1.练习1

1.1 建表

数据:

悟空    A       男
大海    A       男
宋宋    B       男
凤姐    A       女
婷姐    B       女
婷婷    B       女

需求:求出不同部门男女各多少人。结果如下

A     2       1
B     1       2

建表:

create table emp_sex(
name string, 
dept_id string, 
sex string) 
row format delimited fields terminated by "\t";

加载数据:

load data local inpath '/home/atguigu/hivedatas/test1' into table emp_sex;

1.2 思路1

关键词: 不同部门,男女,各多少人

思路1:①按部门分组,group by

​ ②按男女性别过滤,where

​ ③求每个部门中记录的条数,count(*)

sql:

select t1.dept_id,male_count,female_count
from
(select  dept_id,count(*) male_count
from emp_sex
where sex='男'
group by dept_id)t1
join
(select  dept_id,count(*) female_count
from emp_sex
where sex='女'
group by dept_id)t2
on t1.dept_id=t2.dept_id

此条SQL会启动3个Job,因为嵌套了子查询!

在写hivesql时,尽量避免子查询!

1.3 思路2

关键词: 不同部门,男女,各多少人

思路2: 用sum来累加统计!如果统计的是男人,只要这条记录是男性,记1,否则记0!

​ 对以上值进行累加求和可以求出总的男性数量!

​ 根据部门进行分组即可

SQL:

select dept_id,sum(if(sex='男',1,0)) male_count,
sum(if(sex='女',1,0)) female_count
from emp_sex
group by dept_id

2.练习2

2.1 建表

create table person_info(
name string, 
constellation string, 
blood_type string) 
row format delimited fields terminated by "\t";

加载数据:

load data local inpath '/home/atguigu/hivedatas/test2' into table person_info;

需求:把星座和血型一样的人归类到一起,结果如下:

射手座,A            大海|凤姐
白羊座,A            孙悟空|猪八戒
白羊座,B            宋宋

2.2 思路1

关键词: 星座,血型一致的人归类到一起!

思路: ①按照星座,血型分组

​ ②结果有两列

​ 第一列是星座和血型,使用,拼接后的结果 concat()

​ 第二列是name列多行数据转一行数据的拼接的结果,collect_list和concat_ws

sql:

select concat(constellation,',',blood_type),concat_ws('|',collect_list(name))
from  person_info
group by constellation,blood_type

在group by的语句中,select后面的表达式可以写什么?

select只能写group by 后面的字段和聚集函数中的字段

3.练习3

3.1 建表

create table movie_info(
    movie string, 
    category array) 
row format delimited fields terminated by "\t"
collection items terminated by ",";

加载数据:

load data local inpath '/home/atguigu/hivedatas/test3' into table movie_info;

3.2 需求

将电影名称和电影的类型展开!

错误:

select t2.movie,t1.c1
from movie_info t2
left join 
(select explode(category)  c1 from movie_info) t1

在Join时,由于没有关联字段,造成笛卡尔集,并不能达到我们预期的效果!

需求: 炸裂的临时结果集中的每一行,可以和炸裂之前的所在行的其他字段进行join!
hive 提供了支持此需求的实现,称为LATERAL VIEW(侧写)

语法:

select 临时列名,其他字段
from 表名
-- 将 UDTF函数执行的返回的结果集临时用临时表名代替,结果集返回的每一列,按照顺序分别以临时--列名代替
lateral view UDTF() 临时表名 as 临时列名,...

示例:

select  movie,col1
from movie_info
lateral view explode(category) tmp1 as col1

4.练习4

4.1 数据

jack|tom|jerry	阳光男孩|肌肉男孩|直男	晒太阳|健身|说多喝热水
marry|nancy	阳光女孩|肌肉女孩|腐女	晒太阳|健身|看有内涵的段子

4.2 建表

create table person_info2(names array,tags array,hobbys array)
row format delimited fields terminated by '\t'
collection items terminated by '|'

加载数据:

load data local inpath '/home/atguigu/hivedata/shine.txt' into table person_info2;

4.3 需求

将names,hobbys,tags拆分,组合!

结果如下:

jack	阳光男孩	晒太阳
jack	阳光男孩	健身
jack	阳光男孩	说多喝热水
jack	肌肉男孩	晒太阳
jack	肌肉男孩	健身
jack	肌肉男孩	说多喝热水
......

sql:

select name,tag,hobby
from person_info2
lateral view explode(names) tmp1 as name
lateral view explode(hobbys) tmp1 as hobby
lateral view explode(tags) tmp1 as tag

你可能感兴趣的:(bigdata,hive)