探索HQL和SQL使用查询时的区别(持续更新ing...)


前言

        大于大数据工作者来说,MapReduce优化了处理大型数据的方式和速度问题,而hive则解决了处理复杂分组的程序编写的问题,我们只需要编写HiveQL语句即可转换成一系列成MapReduce作业并执行。

        虽然Hql与sql有很多相似处,但是还是有不少区别点的,下面总结下博主目前遇到的不同点,如果写的有不完整或者错误的地方,还请各位看官不吝指出。


举例数据来源,mysql和hive中两张表字段一致,数据一致;

mysql表:

  • 学生信息表:
create table student(
    sid int primary key auto_increment,               	--学生id
    sname varchar(16) not null,							--学生姓名
    gender enum('女','男') not null default '女',		--学生性别
    class_id int not null,								--学生班级id
    foreign key(class_id) references class(cid)			--主外键关联
);
  • 学生成绩表
create table score(
    sid int not null unique auto_increment,				--成绩序号
    student_id int not null,							--学生id
    course_id int not null,								--课程id
    score int not null,									--分数值
    primary key(student_id,course_id),
    foreign key(student_id) references student(sid)		--关联学生表
    on delete cascade
    on update cascade,
    foreign key(course_id) references course(cid)		--关联课程表
    on delete cascade
    on update cascade
);

这里我将这两张表同时导入了hive,先在hive建表,之后使用sqoop进行数据导入;

hive表:

  • 学生信息表
-- create table student(
-- sid int,
-- sname string,
-- gender string,
-- class_id int)
-- row format delimited
-- fields terminated by '\t'
-- stored as textfile
  • 学生成绩表
-- create table score(
-- sid int,
-- student_id int,
-- course_id int,
-- score int)
-- row format delimited
-- fields terminated by '\t'
-- stored as textfile

一、子查询不能作为查询字段使用

        可能很多人和博主一样,在查询字段里喜欢穿插两三个子查询使用,比如查询学生成绩表时需要关联学生信息表,从而获得学生的姓名,我们平常使用orcle或者mysql时,直接在查询字段里加一个子查询即可,但是在HIve里则无法使用,此时需要join关联学生信息表才可以关联;

e.g.查询学生id,学生姓名,学生成绩

  • 在mysql里使用子查询作为查询字段,执行语句正常
select
	s.student_id id,
	(select t.sname from student t where t. sid = s.student_id) name,
	s.score
from
	score  s;
  • 在hive里这样用系统就会报错,得使用join关联表
select
	s.student_id id,
	t.sname name,
	s.score
from
	score s
inner join
	student t
on
	s.student_id = t.sid

二、group by分组时,查询字段中除聚合字段不能包含分组字段中没有的字段

        在mysql中使用group by分组查询时,查询字段可以出现分组字段中不包含的字段,但是在hive中不能出现其他字段,否则报错;

e.g.

  • 在mysql中,成绩按照课程分组,查询字段加入学生id,查询结果student_id结果虽不符合逻辑,但查询无异常;
select
	s.course_id,
	s.student_id,
	sum(s.score)
from
	score s
group by 
	s.course_id;
  • 在hive里使用上面的查询语句则报错,将s.student_id去除才可正常查询,或者将s.student_id加入到分组字段也可查询;
select
	s.course_id,
	sum(s.score)
from
	score s
group by 
	s.course_id
	
----------------------------

select
	s.course_id,
	s.student_id,
	sum(s.score)
from
	score s
group by 
	s.course_id,s.student_id


PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!

原创作者:wsjslient

作者主页:https://blog.csdn.net/wsjslient


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值