数据:
悟空 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:①按部门分组,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时,尽量避免子查询!
关键词: 不同部门,男女,各多少人
思路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
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 宋宋
关键词: 星座,血型一致的人归类到一起!
思路: ①按照星座,血型分组
②结果有两列
第一列是星座和血型,使用,拼接后的结果 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 后面的字段和聚集函数中的字段
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;
将电影名称和电影的类型展开!
错误:
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
jack|tom|jerry 阳光男孩|肌肉男孩|直男 晒太阳|健身|说多喝热水
marry|nancy 阳光女孩|肌肉女孩|腐女 晒太阳|健身|看有内涵的段子
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;
将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