大数据之Hive基本查询

文章目录

  • 前言
  • 一、Hive基本查询
    • (一)普通查询
    • (二)Join查询
    • (三)排序查询
  • 总结


前言

#博学谷IT学习技术支持#
这一次主要介绍Hive的基本查询以及相关函数,Hive的查询以及函数用法与MySQL不尽相同,但是底层运行逻辑完全不同。

一、Hive基本查询

(一)普通查询

数据准备:
大数据之Hive基本查询_第1张图片

  1. 简单查询
  • 查询全表数据
select * from score
  • 聚合函数
 select sum(sscore) from score; // 319
 select avg(sscore) from score; // 79.75
  1. limit关键字,显示前几行数据
select * from score limit 3;
select * from score limit 2,3;  --从索引为2(从0开始)显示,显示3行

大数据之Hive基本查询_第2张图片

  1. where条件查询
select * from score where sscore not in(80,90); -- 成绩不是80或者90
select * from score where not sscore  in(80,90);-- 成绩不是80或者90
  1. like关键字
select * from score where name like '李%'; --  姓李的
select * from score where name like '%安'; --  名字最后一个字是 安
select * from score where name like '%安%'; -- 名字中包含 安
select * from score where name like '_安%'; -- 名字第二个字是 安\
  1. 分组
-- 分组之后每一组只剩下一条数据,所以select后边只能跟分组字段和聚合函数
select  id, sum(sscore) from score group by id;

-- 分组之后的条件筛选是having,不是where
select  id, sum(sscore) as total_score from score group by id having  total_score > 450

(二)Join查询

  1. 内连接,求交集
select * from  teacher inner join course c on teacher.tid = c.tid;
select * from  teacher  join course c on teacher.tid = c.tid;
select * from  teacher , course where teacher.tid = course.tid;
  1. 左外连接,以左表为主,把左表的数据全部输出,右表有对应的数据就输出,没有对应的数据就输出NULL
select * from  teacher left  join course c on teacher.tid = c.tid;
  1. 右外连接,与左连接相反,右外是以右表为主,把右表的数据全部输出,左表有对应的数据就输出,没有对应的数据就输出NULL
select * from  teacher right  join course c on teacher.tid = c.tid;
  1. 满外连接,查询左外连接和右外连接的并集
select * from  teacher full  join course c on teacher.tid = c.tid;

(三)排序查询

  • order by
    1. order by 用于全局排序,使用时只能有一个Reduce
    2. 如果有多个Reduce,则不能使用order by
    3. order by 的使用方法和MySQL是一样的
select * from score order by sscore ;     -- 升序排序
select * from score order by sscore desc; -- 降序排序
  • sort by
    1. 会将表文件拆分成多个文件(默认的分区)
    2. 保证每一个输出的文件内容都有序
1)设置reduce个数
   set mapreduce.job.reduces=3;
2)查询成绩按照成绩降序排列
   select * from score sort by sscore;
3) 将查询结果导入到文件中(按照成绩降序排列)
   insert overwrite local directory '/export/data/exporthive/sort' select * from score sort by sscore;
  • distributed by + sort by,distributed by 会按照某个字段进行分区,sort by 会给每个分区的数据进行排序
1)设置reduce的个数,将我们对应的sid划分到对应的reduce当中去
  set mapreduce.job.reduces=7;
2)通过distribute by进行数据的分区
  insert overwrite local directory '/export/data/exporthive/distribute'
    select * from score distribute by sid sort by sscore; 
  • cluster by
    1. 当distributed by 和 sort by字段相同时:cluster by 等价于 distributed by + sort by
      cluster by id => distributed by id sort by id

    2. 当reduce个数 < id的个数时,排序有意义
      id有100个 reduce 100个

 set mapreduce.job.reduces=2;
 insert overwrite local directory '/export/data/exporthive/cluster_by'
   select * from score  cluster by sid;

总结

Hive的基本查询与Mysql几乎相同,因为Hive底层是MapReduce,所以Hive与Mysql不同的有distributed by和sort by,前者是按照某个表字段进行分区,后者是对每个分区进行排序,其余的知识点不尽相同。

你可能感兴趣的:(Hive,hive,大数据,hadoop)