hive基础知识三

1. 基本查询

  • 注意

    • SQL 语言大小写不敏感
    • SQL 可以写在一行或者多行
    • 关键字不能被缩写,也不能分行
    • 各子句一般要分行写
    • 使用缩进提高语句的可读性

1.1 全表和特定列查询

  • 全表查询
select * from student;
  • 选择特定列查询
select empno, ename from emp;

1.2 列起别名

  • 重命名一个列

    • 紧跟列名,也可以在列名和别名之间加入关键字 ‘as’
  • 案例实操
    select ename AS name, deptno dn from emp;

1.3 常用函数

  • 1.求总行数(count)
 select count(*) cnt from emp;
  • 2、求工资的最大值(max)
select max(sal) max_sal from emp;
  • 3、求工资的最小值(min)
select min(sal) min_sal from emp;
  • 4、求工资的总和(sum)
select sum(sal) sum_sal from emp; 
  • 5、求工资的平均值(avg)
select avg(sal) avg_sal from emp;

1.4 limit 语句

  • 典型的查询会返回多行数据。limit子句用于限制返回的行数。
select * from emp limit 5;

1.5 where 语句

  • 1、使用 where 子句,将不满足条件的行过滤掉
  • 2、where 子句紧随from子句
  • 3、案例实操
select * from emp where sal >1000;

1.6 算术运算符

运算符 描述
A+B A和B 相加
A-B A减去B
A*B A和B 相乘
A/B A除以B
A%B A对B取余
A&B A和B按位取与
A|B A和B按位取或
A^B A和B按位取异或
~A A按位取反

1.7 比较运算符

操作符 支持的数据类型 描述
A=B 基本数据类型 如果A等于B则返回true,反之返回false
A<=>B 基本数据类型 如果A和B都为NULL,则返回true,其他的和等号(=)操作符的结果一致,如果任一为NULL则结果为NULL
A<>B, A!=B 基本数据类型 A或者B为NULL则返回NULL;如果A不等于B,则返回true,反之返回false
A<B 基本数据类型 A或者B为NULL,则返回NULL;如果A小于B,则返回true,反之返回false
A<=B 基本数据类型 A或者B为NULL,则返回NULL;如果A小于等于B,则返回true,反之返回false
A>B 基本数据类型 A或者B为NULL,则返回NULL;如果A大于B,则返回true,反之返回false
A>=B 基本数据类型 A或者B为NULL,则返回NULL;如果A大于等于B,则返回true,反之返回false
A [NOT] BETWEEN B AND C 基本数据类型 如果A,B或者C任一为NULL,则结果为NULL。如果A的值大于等于B而且小于或等于C,则结果为true,反之为false。如果使用NOT关键字则可达到相反的效果。
A IS NULL 所有数据类型 如果A等于NULL,则返回true,反之返回false
A IS NOT NULL 所有数据类型 如果A不等于NULL,则返回true,反之返回false
IN(数值1, 数值2) 所有数据类型 使用 IN运算显示列表中的值
A [NOT] LIKE B STRING 类型 B是一个SQL下的简单正则表达式,如果A与其匹配的话,则返回true;反之返回false。B的表达式说明如下:‘x%’表示A必须以字母‘x’开头,‘%x’表示A必须以字母’x’结尾,而‘%x%’表示A包含有字母’x’,可以位于开头,结尾或者字符串中间。如果使用NOT关键字则可达到相反的效果。like不是正则,而是通配符
A RLIKE B, A REGEXP B STRING 类型 B是一个正则表达式,如果A与其匹配,则返回true;反之返回false。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。

1.8 逻辑运算符

操作符 操作 描述
A AND B 逻辑并 如果A和B都是true则为true,否则false
A OR B 逻辑或 如果A或B或两者都是true则为true,否则false
NOT A 逻辑否 如果A为false则为true,否则false

 2. 分组 

2.1 Group By 语句

? Group By 语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。

  • 案例实操:

    • (1)计算emp表每个部门的平均工资
    select t.deptno, avg(t.sal) as avg_sal from emp t group by t.deptno;
    • (2)计算emp每个部门中每个岗位的最高薪水
    select t.deptno, t.job, max(t.sal) as  max_sal from emp t group by t.deptno, t.job;

2.2 Having语句

  • having 与 where 不同点

    • where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据
    • where后面不能写分组函数,而having后面可以使用分组函数
    • having只用于group by分组统计语句
  • 案例实操
    • 求每个部门的平均工资
    select deptno, avg(sal) from emp group by deptno;
    • 求每个部门的平均薪水大于2000的部门
    select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

3. join语句

3.1 等值 join

  • Hive支持通常的SQL JOIN语句,但是只支持等值连接,不支持非等值连接。
  • 案例实操
    • 根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;
    select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;

3.2 表的别名

  • 好处

    • 使用别名可以简化查询。
    • 使用表名前缀可以提高执行效率。
  • 案例实操
    • 合并老师与课程表
    select * from teacher t join course c on t.id = c.id;

数据准备:

create table teacher
(
id string,
tname string
)row format delimited
fields terminated by ‘,‘;
--teacher.txt 数据
1,吕布
2,关羽
3,刘备
4,赵云
5,曹操

create table course
(
cid string,
cname string,
id string
)row format delimited
fields terminated by ‘,‘;
--course.txt 数据
11,语文,1
22,数学,2
33,英语,3
44,物理,4
55,大数据,6

3.3 内连接 inner join

  • 内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。

    • join默认是inner join
  • 案例实操
select * from teacher t inner join course c  on t.id = c.id;

--查询结果:
+-------+----------+--------+----------+-------+--+
| t.id | t.tname | c.cid | c.cname | c.id |
+-------+----------+--------+----------+-------+--+
| 1 | 吕布 | 11 | 语文 | 1 |
| 2 | 关羽 | 22 | 数学 | 2 |
| 3 | 刘备 | 33 | 英语 | 3 |
| 4 | 赵云 | 44 | 物理 | 4 |
+-------+----------+--------+----------+-------+--+

3.4 左外连接 left outer join

  • 左外连接:join操作符左边表中符合where子句的所有记录将会被返回。
  • 案例实操
    • 查询老师对应的课程
     select * from teacher t left outer join course c  on t.id = c.id;

    -----查询结果:
    +-------+----------+--------+----------+-------+--+
    | t.id | t.tname | c.cid | c.cname | c.id |
    +-------+----------+--------+----------+-------+--+
    | 1 | 吕布 | 11 | 语文 | 1 |
    | 2 | 关羽 | 22 | 数学 | 2 |
    | 3 | 刘备 | 33 | 英语 | 3 |
    | 4 | 赵云 | 44 | 物理 | 4 |
    | 5 | 曹操 | NULL | NULL | NULL |
    +-------+----------+--------+----------+-------+--+

3.5 右外连接 right outer join

  • 右外连接:join操作符右边表中符合where子句的所有记录将会被返回。
  • 案例实操
    select * from teacher t right outer join course c  on t.id = c.id;

    -----查询结果:
    +-------+----------+--------+----------+-------+--+
    | t.id | t.tname | c.cid | c.cname | c.id |
    +-------+----------+--------+----------+-------+--+
    | 1 | 吕布 | 11 | 语文 | 1 |
    | 2 | 关羽 | 22 | 数学 | 2 |
    | 3 | 刘备 | 33 | 英语 | 3 |
    | 4 | 赵云 | 44 | 物理 | 4 |
    | NULL | NULL | 55 | 大数据 | 6 |
    +-------+----------+--------+----------+-------+--+

3.6 满外连接 full outer join

  • 满外连接:将会返回所有表中符合where语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用null值替代。
  • 案例实操
    select * from teacher t full outer join course c  on t.id = c.id;

    -----查询结果:
    +-------+----------+--------+----------+-------+--+
    | t.id | t.tname | c.cid | c.cname | c.id |
    +-------+----------+--------+----------+-------+--+
    | 1 | 吕布 | 11 | 语文 | 1 |
    | 2 | 关羽 | 22 | 数学 | 2 |
    | 3 | 刘备 | 33 | 英语 | 3 |
    | 4 | 赵云 | 44 | 物理 | 4 |
    | 5 | 曹操 | NULL | NULL | NULL |
    | NULL | NULL | 55 | 大数据 | 6 |
    +-------+----------+--------+----------+-------+--+

3.7 多表连接

  • 多个表使用join进行连接
  • 注意:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。
  • 案例实操
    • 多表连接查询,查询老师对应的课程,以及对应的分数,对应的学生
    select * from
        teacher t  left join course c on t.id = c.id
                   left join score s on s.sid = c.cid
                   left join student stu on s.s_id = stu.s_id;

4. 排序(20分钟)

4.1 order by 全局排序

  • order by 说明

    • 全局排序,只有一个reduce
    • 使用 ORDER BY 子句排序
      • asc ( ascend)

        • 升序 (默认)
      • desc (descend)
        • 降序
    • order by 子句在select语句的结尾
  • 案例实操
    • 查询学生的成绩,并按照分数降序排列
    select * from student s order by score desc ;

4.2 按照别名排序

  • 按照学生分数的平均值排序
select s.sid,s.tname, avg(score)  as score_avg  from student s  group by  s.sid,s.tname order by score_avg  desc;

4.3 多个列排序

  • 按照学生分数和年龄升序排序
select *  from student s order by score,age;

4.4 每个MapReduce内部排序(Sort By)局部排序

  • sort by:每个reducer内部进行排序,对全局结果集来说不是排序。

    • 1、设置reduce个数

      set mapreduce.job.reduces=3;
      • 2、查看设置reduce个数

        set mapreduce.job.reduces;
    • 3、查询成绩按照成绩降序排列
      select * from student s sort by s.score;
    • 4、将查询结果导入到文件中(按照成绩降序排列)
      insert overwrite local directory ‘/home/hadoop/hivedata/sort‘ select * from student s sort by s.score;

4.5 distribute by 分区排序

  • distribute by:类似MR中partition,采集hash算法,在map端将查询的结果中hash值相同的结果分发到对应的reduce文件中。结合sort by使用。
  • 注意
    • Hive要求 distribute by 语句要写在 sort by 语句之前。
  • 案例实操
    • 先按照学生 sid 进行分区,再按照学生成绩进行排序

      • 设置reduce的个数
      set mapreduce.job.reduces=3;
      • 通过distribute by 进行数据的分区,,将不同的sid 划分到对应的reduce当中去
      insert overwrite local directory ‘/home/hadoop/hivedata/distribute‘ select * from student distribute by sid sort by score;

4.6 cluster by

  • 当distribute by和sort by字段相同时,可以使用cluster by方式
  • 除了distribute by 的功能外,还会对该字段进行排序,所以cluster by = distribute by + sort by
    --以下两种写法等价
    insert overwrite local directory ‘/home/hadoop/hivedata/distribute_sort‘
    select * from student distribute  by score sort  by score;
    ?
    insert overwrite local directory ‘/home/hadoop/hivedata/cluster‘
    select * from student cluster by score;

5、case...when...then

5.1 case ... when ... then 语句

  • case ...when ..then 语句和if 条件语句类似,用于处理单个列的查询结果
  • 案例实战
    • 创建表
    create table employee(
    empid int,
    deptid int,
    sex string,
    salary double
    )row format delimited
    fields terminated by ‘ ‘;
    • 数据文件 employee.txt
    1       10      female  5500.0
    2       10      male    4500.0
    3       20      female  1900.0
    4       20      male    4800.0
    5       40      female  6500.0
    6       40      female  14500.0
    7       40      male    44500.0
    8       50      male    6500.0
    9       50      male    7500.0
    • 查询统计

      • 将员工按照性别打上标识
      select *,
      case sex
      when "female" then 1
      when "male" then 0
      end as flag
      from employee;
      • 将员工按照薪资待遇划分等级
      select *,
      case
      when salary < 5000 then "低等收入"
      when salary>= 5000 and salary < 10000 then "中等收入"
      when salary > 10000 then "高等收入"
      end  as level
      from employee;

5.2  row_number()使用

###################### 统计每个部门薪资最高的员工信息  #####################
select *, row_number() over(distribute by deptid sort by salary desc ) rn from employee;

##统计结果
1       10      female  5500.0  1
2       10      male    4500.0  2
4       20      male    4800.0  1
3       20      female  1900.0  2
7       40      male    44500.0 1
6       40      female  14500.0 2
5       40      female  6500.0  3
9       50      male    7500.0  1
8       50      male    6500.0  2

5.2 什么情况下Hive可以避免进行MapReduce

  • hive 为了执行效率考虑,简单的查询,就是只是select,不带count,sum,group by这样的,都不走map/reduce,直接读取hdfs目录中的文件进行filter过滤。也就是所谓的本地模式

    • 1、直接查询表的数据,不会进行Mapreduce

      select * from employee;
    • 2、查询语句中的过滤条件只是分区字段的情况下,不会进行Mapreduce。
      select * from order_partition where month=‘2019-03‘;
    • 此外,如果设置属性 set hive.exec.mode.local.auto=true; hive还是会尝试使用本地模式

原文地址:https://www.cnblogs.com/lojun/p/11376776.html

时间: 2024-08-02 22:53:03

hive基础知识三的相关文章

20_Shell语言———VIM编辑器基础知识三之窗口属性定制、配置文件及查找替换功能

Vim编辑器可以让用户按照需求来定制一些使用属性. 一.窗口属性定义 1)显示行号 行号不是内容,只是用来帮助用户确认文本所在的行.在vim编辑器中,如果要显示行号,可以在末行模式下输入: set number 如果想关闭,则可以在功能名称前面加上no,即: set nonumber 命令可以被简写,如set number 可以简写为 set nu:set nonumber 可以简写为 set nonu. 注意,上述设定仅对当前vim的进程有效,一旦当前进程关闭,这些设定就会失效,如果要使设定永

计算机科学基础知识(三)静态库和静态链接

三.将relocatable object file静态链接成可执行文件 将relocatable object file链接成可执行文件分成两步,第一步是符号分析(symbol resolution),第二步是符号重新定位(Relocation).本章主要描述这两个过程,为了完整性,静态库的概念也会在本章提及. 1.为什么会提出静态库的概念? 程序逻辑有共同的需求,例如数学库.字符串库等,如果每个程序员在撰写这些代码逻辑的时候都需要自己重新写那么该是多么麻烦的事情,而且容易出错,如果有现成的,

Dapper基础知识三

在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. Dapper,当项目在开发的时候,在没有必要使用依赖注入的时候,如何做到对项目的快速开发这里对Dapper做一个小的进阶. 结合上一篇的博客,就可以使用了. public class Demo { public string name { get; set; } public string DapperTest { get; set; } } public class

《Programming Hive》读书笔记(二)Hive基础知识

阅读方法:第一遍读是浏览,建立知识索引,因为有些知识不一定能用到,知道就好.感兴趣的部分可以多研究. 以后用的时候再详细看,并结合其他资料一起. Chapter 3.Data Types and File Formats 原始数据类型和集合数据类型 Select出来的数据,列与列之间的分隔符可以指定 Chapter 4.HiveQL:Data Definition 创建数据库,创建和改动表,分区的操作 Chapter 5.HiveQL:Data Manipulation 1 加载数据和导出数据,

Hive基础知识

一.Hive简介什么是Hive为什么使用Hive面临的问题:为什么要使用Hive:二.Hive结构三.Hive支持的格式四.表的操作创建表删除表清空表修改表修改字段名与字段类型增加列修改列的顺序删除列替换表修改字段顺序其他操作查看表信息查看建表信息查看格式信息改变表文件格式查看函数五.数据操作1.插入数据从文件读取数据从其他结果集插入2.分区和分桶创建分区表查看分区插入分区数据添加分区重命名分区删除分区分区使用分桶六.复合类型ArrayMap七.创建视图和索引以及数据缓存视图创建视图删除视图索引

《Programming Hive》读书笔记(两)Hive基础知识

:第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结合其它资料一起. Chapter 3.Data Types and File Formats 原始数据类型和集合数据类型 Select出来的数据,列与列之间的分隔符能够指定 Chapter 4.HiveQL:Data Definition 创建数据库,创建和修改表,分区的操作 Chapter 5.HiveQL:Data Manipulation 1 载入数据和导出数据,应该从本

【基础知识三】线性模型

一.基本形式 通过属性的线性组合来进行预测, 许多非线性模型可以在线性模型的基础上,引入层级结构或高维映射而得. 二.线性回归 最小二乘法:求解ω和b: 多元线性回归:样本由多个属性描述,即x为多维向量: 若矩阵不满秩产生多个解,解决方法:引入正则化项: 三.对数/逻辑线性回归 广义线性模型: g(.)条件:连续且充分光滑(单调可微) 为了预测值连续,引入Sigmoid函数 得到, 极大似然估计:求解ω和b 四.线性判别分析LDA 也叫"Fisher判别" 将样例投影到一条直线上,使同

KnockoutJS基础知识(三)

对于knockoutJS来讲,模板绑定和Mapping插件绑定是十分重要的功能,虽然模板绑定在我工作中用的及其少,但模板绑定的重要性不可忽视,在其他前端框架中,如Angular.Vue等等,模板存在的意义十分重要,Mapping插件使得我们能够脱离手工绑定,及其方便我们快速绑定达到预期效果. KnockoutJS模型绑定更多用法:https://knockoutjs.com/documentation/template-binding.html 本文地址:https://www.cnblogs.

hive基础知识四

1. hive表的数据压缩 1.1 数据的压缩说明 压缩模式评价 可使用以下三种标准对压缩方式进行评价 1.压缩比:压缩比越高,压缩后文件越小,所以压缩比越高越好 2.压缩时间:越快越好 3.已经压缩的格式文件是否可以再分割:可以分割的格式允许单一文件由多个Mapper程序处理,可以更好的并行化 常见压缩格式 压缩方式 压缩比 压缩速度 解压缩速度 是否可分割 gzip 13.4% 21 MB/s 118 MB/s 否 bzip2 13.2% 2.4MB/s 9.5MB/s 是 lzo 20.5