mr的继承类
1.map extends Mapper
2.reduce extends Reduce
3.bean implements WriteableComparable
4.groupConmparator extends WriteableComparator
5.softComparator extends WriteableComparator
6.partitioner extends Partitioner
7.driver 必须有main方法
mr的driver
1.new Configuration获取配置
2.new Job对资源的获取
3.job.setJarByClass
4.input/output
5.setMapperClass
6.setMapperOutputKeyClass
create databases if not exits myhive;
创建数据库并指定hdfs的存储位置
create database myhive2 location ’/myhive2‘;
删除一个空的数据库,如果数据库下面有表就会报错
drop database myhive2;
强制删除一个数据库
drop database myhive cascade
查询所有数据
select * from table_name
insert into table_name values (data,data)
创建表并指定字段之间的分割符号
create table if not exits stu2 (id int,name string) row format delimited fields terminated
by ‘\t’ stored as textfile location ‘/user/stu2’
根据查询结果创建表
create table stu3 as select * from stu2;
根据已经存在的表的结构创建表
create table stu4 like stu2
查询表的类型
desc formatted stu2
外部表
create external table teacher (t_id string,t_name string) row format delimited
fields terminated by ‘\t’;
create external table student (s_id string,s_name string,s_brith string,s_sex string) row format
delimited fields terminated by ‘\t’;
从本地文件系统向表中加载数据
load data local inpath '/export/srtiver/-*.txt’ into table student ;
加载数据并覆盖已有的数据
load data local inpath ’/export/srtiver/-**.txt‘
从hdfs文件系统向表中加载数据(需要提前将数据上传到hdfs文件系统,其实就是一个移动文件的操作)
cd /export/srtiver/-***
hdfs dfs -mkdir -p /hivedatas
hdfs dfs -put teacher.csv /hivedatas/
local data inpath ‘/hivedatas/teacher.csv’ into table teacher ;
清空表数据
truncate table score6;
hive查询语法
select s_id as myid ,c_id from score;
常用的函数
求总行数(count)
select count(1) from score
求分数的最大值(max)
select max(s_score) from score;
求分数的最小值(min)
select min(s_score) from score;
求分数的和(sum)
select sum(s_score)from score;
求分数的平均值(avg)
select avg (s_score) from score;
limit 语句
limit语句会限制返回的行数
select from score limit 3;
where语句
1)使用where子句,将不满足条件的行过滤掉
2)where子句紧跟from子句
3)案例实操
查询出分数大于60的数据
select * from score where s_score >60;
查询分数等于80的所有数据
select * form where s_score =80
查询分数在80到100之间的所有数据
select from score where s_score between 80 and 100;
查询成绩为空的所有数据
select * from score where s-score is null
查询成绩是80和90的数据
select * from score where s_score in (80,90);
like和relike
1)使用like运算选择类似的值
2)选择条件可以包含字符或者数字
% 代表零个或者多个字符或者数字
_ 代表一个字符
3)rlike子句是hive中这个功能的一个扩展,其可以通过java的正则表达式这个更强大的
语言来指定匹配条件
4)案例实操
(1)查找以8开头的所有成绩
select * from score where s-score like ‘8%’;
(2)查找第二个数值为9的所有成绩数据
select from score where s-score like ‘_9%’;
(3)查找成绩中含有9的所有成绩的数据
select * from score where s-score relike ‘[9]’
逻辑运算符
(1)查询成绩大于80,并且s_id是01的数据
select * from score where s_score >80 and s_id =‘01’
(2)查询成绩大于80,或者s_id是01的数据
select * from score where s_score >80 or s_id=‘01’
(3)查询s_id 不是01和02的学生
select * from score where s_id not in (‘01’,‘02’);
group by 语句
groupby语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行
聚合操作
(1)计算每个学生的平均分数
select s_id ,avg(s_score)from score group by s_id;
(2)计算每个学生的最高成绩
select s_id ,max(s_score)from score group by s_id;
having 语句
1)having 与 where不同点
(1)where针对表中的列发挥作用,查询数据;having 针对查询结果中的列发挥作用筛选数据
(2)where 后面不能写分组函数,而having后面可以使用分组函数
(3)having 只用于group by分组统计语句
2)实例实操
求每个学生的平均分数
select s_id ,avg(s_score)from score group by s_id;
求每个学生平均分数大于85的人
select s_id ,avg(s_score )avgscore from score group by s_id having avgscore>85
等值join
hive支持通常的sqljoin语句,但是只支持等值连接,不支持非等值连接。
案例实操
(1)查询分数对应的姓名
select s.s_id,s.s_score,stu.s_name,stu.s_birth from score s left join student stu on
s.s_id = stu.s_id
1)好处
(1)使用别名可以简化查询。
(2)使用表名前缀可以提高执行效率。
2)案例实操
合并老师与课程表
select * from teacher t join course c on t.t_id = c.t_id;
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
select * from teacher t inner join course c on t.t_id = c.t_id;
左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。
查询老师对应的课程
select * from teacher t left join course c on t.t_id = c.t_id;
右外连接(RIGHT OUTER JOIN)
右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返回。
select * from teacher t right join course c on t.t_id = c.t_id;
满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。
SELECT * FROM teacher t FULL JOIN course c ON t.t_id = c.t_id ;
Order By:全局排序,一个reduce
1)使用 ORDER BY 子句排序
ASC(ascend): 升序(默认)
DESC(descend): 降序
2)ORDER BY 子句在SELECT语句的结尾。
3)案例实操
(1)查询学生的成绩,并按照分数降序排列
SELECT * FROM student s LEFT JOIN score sco ON s.s_id = sco.s_id ORDER BY sco.s_score DESC;
(2)查询学生的成绩,并按照分数升序排列
SELECT * FROM student s LEFT JOIN score sco ON s.s_id = sco.s_id ORDER BY sco.s_score asc;
按照别名排序
按照分数的平均值排序
select s_id ,avg(s_score) avg from score group by s_id order by avg;
多个列排序
按照学生id和成绩进行排序
select s_id ,avg(s_score) avg from score group by s_id order by s_id,avg;
每个MapReduce内部排序(Sort By)局部排序
Sort By:每个MapReduce内部进行排序,对全局结果集来说不是排序。
1)设置reduce个数
set mapreduce.job.reduces=3;
2)查看设置reduce个数
set mapreduce.job.reduces;
3)查询成绩按照成绩降序排列
select * from score sort by s_score;
1)将查询结果导入到文件中(按照成绩降序排列)
insert overwrite local directory ‘/export/servers/hivedatas/sort’ select * from score sort by s_score;
CLUSTER BY
当distribute by和sort by字段相同时,可以使用cluster by方式。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒序排序,不能指定排序规则为ASC或者DESC。
1)以下两种写法等价
select * from score cluster by s_id;
select * from score distribute by s_id sort by s_id;