Hive查询操作详解

Hive

数据准备:
在这里插入图片描述
在这里插入图片描述
Tips:
(1)SQL 语言大小写不敏感。
(2)SQL 可以写在一行或者多行。
(3)关键字不能被缩写也不能分行
(4)各子句一般要分行写。
(5)使用缩进提高语句的可读性。

1.基本查询(select…from)

1.全表和特定列查询

- 全表查询

hive (default)> select * from emp;

在这里插入图片描述

- 特定列查询

select empno, ename from emp;

在这里插入图片描述

2.列别名

  • 重命名一个列
  • 便于计算
  • 紧跟列名,也可以在列名和别名之间加入关键字‘AS’
 hive (default)> 
select 
    ename AS name, 
    deptno dn 
from emp;

在这里插入图片描述

3.Limit语句

典型的查询会返回多行数据。limit子句用于限制返回的行数。

hive (default)> select * from emp limit 5; 

在这里插入图片描述

hive (default)> select * from emp limit 2,3; -- 表示从第2行开始,向下抓取3行

在这里插入图片描述

4.Where语句

  • 使用where子句,将不满足条件的行过滤掉
  • where子句紧随from子句
查询出薪水大于1000的所有员工。
hive (default)> select * from emp where sal > 1000;

注意:where子句中不能使用字段别名。
在这里插入图片描述

5.关系运算函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

select ename,sal from where sal between 1000 and 2000;

在这里插入图片描述

select ename,job from emp where job is  null;

在这里插入图片描述

select ename from emp where ename like '小%';

在这里插入图片描述

select ename from emp where ename like '小_';

在这里插入图片描述


6.逻辑运算函数

and	逻辑并
or	逻辑或
not	逻辑否

(1)查询薪水大于1000,部门是30

hive (default)> 
select 
    * 
from emp 
where sal > 1000 and deptno = 30;

(2)查询薪水大于1000,或者部门是30

hive (default)> 
select 
    * 
from emp 
where sal>1000 or deptno=30;

(3)查询除了20部门和30部门以外的员工信息

hive (default)> 
select 
    * 
from emp 
where deptno not in(30, 20);

7.聚合函数

  • count(*),表示统计所有行数,包含null值;
  • count(某列),表示该列一共有多少行,不包含null值;
  • max(),求最大值,不包含null,除非所有值都是null;
  • min(),求最小值,不包含null,除非所有值都是null;
  • sum(),求和,不包含null。
  • avg(),求平均值,不包含null。

(1)求总行数(count)

hive (default)> select count(*) cnt from emp;

在这里插入图片描述
在这里插入图片描述

(2)求工资的最大值(max)

hive (default)> select max(sal) max_sal from emp;

在这里插入图片描述
在这里插入图片描述

(3)求工资的最小值(min)

hive (default)> select min(sal) min_sal from emp;

在这里插入图片描述

(4)求工资的总和(sum)

hive (default)> select sum(sal) sum_sal from emp; 

在这里插入图片描述

(5)求工资的平均值(avg)

hive (default)> select avg(sal) avg_sal from emp;

在这里插入图片描述
在这里插入图片描述


2.分组查询(group by)

having与where不同点

  • where后面不能写分组聚合函数,而having后面可以使用分组聚合函数
  • having只用于group by分组统计语句
  • where分组前过滤,having分组后过滤

(1)求每个部门的平均薪水

hive (default)> 
select 
    deptno, 
    avg(sal) 
from emp 
group by deptno;

在这里插入图片描述
在这里插入图片描述

(2)求平均薪水大于2000的部门。

hive (default)>
select 
    deptno, 
    avg(sal) avg_sal 
from emp 
group by deptno  
having avg_sal > 2000;

在这里插入图片描述
在这里插入图片描述


3.联合查询(Join)

Hive支持通常的sql join语句,支持等值连接,也支持非等值连接。

(1)根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称。

hive (default)> 
select 
    e.empno, 
    e.ename, 
    d.dname 
from emp e --重命名
join dept d 
on e.deptno = d.deptno; --员工表和部门表中的部门编号相等

表的别名

  • 使用别名可以简化查询。
  • 区分字段的来源

在这里插入图片描述
在这里插入图片描述
(2)合并员工表和部门表。

hive (default)> 
select 
    e.*,
    d.* 
from emp e 
join dept d 
on e.deptno = d.deptno;

在这里插入图片描述


在这里插入图片描述

内连接

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

hive (default)> 
select 
    e.empno, 
    e.ename, 
    d.deptno 
from emp e 
join dept d 
on e.deptno = d.deptno;

在这里插入图片描述


左外连接

join操作符左边表中符合where子句的所有记录将会被返回

hive (default)> 
select 
    e.empno, 
    e.ename, 
    d.deptno 
from emp e 
left join dept d 
on e.deptno = d.deptno;

在这里插入图片描述

右外连接

join操作符右边表中符合where子句的所有记录将会被返回。

hive (default)> 
select 
    e.empno, 
    e.ename, 
    d.deptno 
from emp e 
right join dept d 
on e.deptno = d.deptno;

在这里插入图片描述


满外连接

将会返回所有表中符合where语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用null值替代。

hive (default)> 
select 
    e.empno, 
    e.ename, 
    d.deptno 
from emp e 
full join dept d 
on e.deptno = d.deptno;

在这里插入图片描述

多表连接

  • 连接n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。
    在这里插入图片描述
    多表连接查询:
hive (default)> 
select 
    e.ename, 
    d.dname, 
    l.loc_name
from emp e 
join dept d
on d.deptno = e.deptno 
join location l
on d.loc = l.loc;

在这里插入图片描述

  • 大多数情况下,Hive会对每对join连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表e和表d进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l进行连接操作。
  • 注意:为什么不是表d和表l先进行连接操作呢?这是因为Hive总是按照从左到右的顺序执行的。

笛卡尔积

笛卡尔集会在下面条件下产生

  • 省略连接条件
  • 连接条件无效
  • 所有表中的所有行互相连接
hive (default)> 
select 
    empno, 
    dname 
from emp, dept;

在这里插入图片描述

联合(union & union all)

  • unionunion all都是上下拼接sql的结果,这点是和join有区别的,join是左右关联,union和union all是上下拼接。
  • union去重,union all不去重。
  • union和union all在上下拼接sql结果时有两个要求:
    (1)两个sql的结果,列的个数必须相同
    (2)两个sql的结果,上下所对应列的类型必须一致

将员工表30部门的员工信息和40部门的员工信息,利用union进行拼接显示。

hive (default)> 
select 
    *
from emp
where deptno=30
union
select 
    *
from emp
where deptno=40;

在这里插入图片描述


4.排序

全局排序(Order By)

Order By:全局排序,只有一个Reduce。

  • 使用Order By子句排序
    asc(ascend):升序(默认)
    desc(descend):降序
  • Order By子句在select语句的结尾

(1)查询员工信息按工资升序排列

hive (default)> 
select 
    * 
from emp 
order by sal;

在这里插入图片描述

在这里插入图片描述
(2)查询员工信息按工资降序排列

hive (default)> 
select 
    * 
from emp 
order by sal desc;

在这里插入图片描述

(3)按照别名排序

  • 按照员工薪水的2倍排序。
hive (default)> 
select 
    ename, 
    sal * 2 twosal 
from emp 
order by twosal;

在这里插入图片描述

在这里插入图片描述

(4)多个列排序案例

按照部门和工资升序排序。

hive (default)> 
select 
    ename, 
    deptno, 
    sal 
from emp 
order by deptno, sal;

在这里插入图片描述
在这里插入图片描述


每个Reduce内部排序(Sort By)

  • Sort By:对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用Sort by。

  • Sort by为每个reduce产生一个排序文件

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

1)设置reduce个数

hive (default)> set mapreduce.job.reduces=3;

2)查看设置reduce个数

hive (default)> set mapreduce.job.reduces;

3)根据部门编号降序查看员工信息

hive (default)> 
select 
    * 
from emp 
sort by deptno desc;

每个Reduce内部进行排序,对全局结果集来说不是排序(局部有序)。
在这里插入图片描述
在这里插入图片描述
4)将查询结果导入到文件中(按照部门编号降序排序)

hive (default)> insert overwrite local directory '/opt/module/hive/datas/sortby'
 select * from emp sort by deptno desc;

在这里插入图片描述

每个reduce内有序。

在这里插入图片描述

分区(Distribute By)

  • Distribute By:在有些情况下,我们需要控制某个特定行应该到哪个Reducer,通常是为了进行后续的聚集操作。
  • distribute by子句可以做这件事。distribute by类似MapReduce中partition(自定义分区),进行分区,结合sort by使用。

(1)先按照部门编号分区,再按照员工薪资排序

  • 对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。
hive (default)> set mapreduce.job.reduces=3;
select 
    * 
from emp 
distribute by deptno 
sort by sal desc;
  • distribute by的分区规则是根据分区字段的hash码与reduce的个数进行相除后,余数相同的分到一个区。
  • Hive要求distribute by语句要写在sort by语句之前
  • 注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去
    在这里插入图片描述

在这里插入图片描述

分区排序(Cluster By)

  • 当distribute by和sort by字段相同并且升序时,可以使用cluster by方式。
  • cluster by除了具有distribute by的功能外还兼具sort by的功能
  • 但是排序只能是升序排序,不能指定排序规则为asc或者desc

(1)以下两种写法等价

hive (default)> 
select 
    * 
from emp 
cluster by deptno;

hive (default)> 
select 
    * 
from emp 
distribute by deptno 
sort by deptno;

注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/571553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程动静态库

文章目录 动态库和静态库1. 静态库2. 动态库 承接上文: 文件描述符 动态库和静态库 静态库与动态库: 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xf…

python绘制R控制图(Range Chart)

R控制图(Range Chart),也称为范围图或移动极差图,是一种用于分析和控制生产过程中的变异性的统计工具。它通常与Xbar控制图(均值图)一起使用,可以提供关于生产过程变异性的额外信息。以下是R控制…

ArgoCD集成部署到Kubernetes

1:环境 kubernetes1.23.3ArgoCD2.3.3 2:ArgoCD介绍 Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 那么,什么是GitOps呢? GitOps是以Git为基…

feign整合sentinel做降级知识点

1&#xff0c;配置依赖 <!-- Feign远程调用依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> <!--sentinel--><dependency>…

Linux使用操作(一)

Linux创建链接的方式 在Linux中&#xff0c;可以给文件创建链接。链接的意思可以理解是快捷方式&#xff0c;它指向另一个文件或目录。 软链接 软连接&#xff08;也叫符号链接&#xff09;是一种特殊类型的文件&#xff0c;它指向另一个文件或目录 语法 ln -s 原文件路径…

谷歌发布基于声学建模的无限虚拟房间增强现实鲁棒语音识别技术

声学室模拟允许在AR眼镜上以最少的真实数据进行训练&#xff0c;用于开发鲁棒的语音识别声音分离模型。 随着增强现实&#xff08;AR&#xff09;技术的强大和广泛应用&#xff0c;它能应用到各种日常情境中。我们对AR技术的潜能感到兴奋&#xff0c;并持续不断地开发和测试新…

SpringBoot---------整合Mybatisplus

快速入门 第一步&#xff1a;导入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency> 第二步&#xff1a;编写mapper…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(下)

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading VII 讨论&#xff1a;关于匿名性与市场平台的困境 在本文的这一部分&#xff0c;我们将讨论关于隐藏 NFT 所有者地址的困境&#xff0c;以及为什么像 OpenSea 这样的 NFT 市场平台几乎必须得到完全的信…

Java | 选择排序算法实现

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;实现选择排序算法。程序需要能够接收一个整型数组作为输入&#xff0c;并输出排序后的数组。 选择排序是一种简单直观的排序算法&#xf…

imx6ull -- SPI

SPI 是 Motorola 公司推出的一种同步串行接口 技术&#xff0c;是一种高速、全双工的同步通信总线&#xff0c; SPI 时钟频率相比 I2C 要高很多&#xff0c;最高可以工作 在上百 MHz。 SPI 以主从方式工作&#xff0c;通常是有一个主设备和一个或多个从设备&#xff0c;一般 SP…

ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

前言&#xff1a; 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了&#xff0c;在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传&#xff0c;今天刚好做了一个和之前类似的文件选择上传的需求&#xff0c;不过这次是需要手动点…

[InternLM训练营第二期笔记]5. LMDeploy 量化部署 LLM 实践

该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。 该笔记是第五节课&#xff0c;学习大语言模型量化的基本概念&#xff0c;以及利用LMDeploy工具进行微调。 0. 模型部署的概念 0.0 背景 如果要将大模型在特定平台&#xff08;大到服务器集群&#xff0c;小到…

需求 分析

需求分析的任务 需求分析的任务 1、需求分析是软件定义时期的最后一个阶段&#xff0c;它的基本任务是准确地回答“系统必须做什么?”这个问题。 2、确定系统必须完成哪些工作&#xff0c;也就是对目标系统提出完整、准确、清晰、具体的要求。 3、系统分析员应该写出软件需求…

Docker网络及CPU资源控制

一、实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容…

Gradio 最快创建Web 界面部署到服务器并演示机器学习模型,本文提供教学案例以及部署方法,避免使用繁琐的django

最近学习hugging face里面的物体检测模型&#xff0c;发现一个方便快捷的工具&#xff01; Gradio 是通过友好的 Web 界面演示机器学习模型的最快方式&#xff0c;以便任何人都可以在任何地方使用它&#xff01; 一、核心优势&#xff1a; 使用这个开发这种演示机器学习模型的…

【C++题解】1302. 是否适合晨练?

问题&#xff1a;1302. 是否适合晨练&#xff1f; 类型&#xff1a;分支 题目描述&#xff1a; 夏天到了&#xff0c;气温太高&#xff0c;小明的爷爷每天有晨练的习惯&#xff0c;但有时候温度不适合晨练&#xff1b;小明想编写一个程序&#xff0c;帮助爷爷判断温度是否适合…

5分钟——测试搭建的springboot接口(二)

5分钟——测试搭建的springboot接口&#xff08;二&#xff09; 1. 查看数据库字段2. 测试getAll接口3. 测试add接口4. 测试update接口5. 测试deleteById接口 1. 查看数据库字段 2. 测试getAll接口 3. 测试add接口 4. 测试update接口 5. 测试deleteById接口

计算机网络-IS-IS基础配置实验

前面我们了解了IS-IS的一些基础理论&#xff0c;从建立邻接、链路状态数据库同步以及路由计算&#xff0c;现在开始学习下配置操作。 一、IS-IS配置 网络拓扑图&#xff1a; 拓扑图 IS-IS有Level级别的区分&#xff0c;Level-1可以是性能较低的设备只维护区域内的LSDB&#xff…

论文辅助笔记:LLM-MOB代码解读

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor-CSDN博客 1 主函数 1.1 导入库 import os import pickle import time import ast import logging from datetime import datetime import pandas as pd from openai import OpenAIclie…

Sqli-labs靶场第25关[Sqli-labs-less-25]自动化注入-SQLmap工具注入

过滤了AND OR 使用的函数是 preg_replace 特点&#xff1a;只对值进行一次检测闭合方式为 单引号 可以使用双写进行绕过 手工注入 ?id0 union select 1,database(),user() -- sqlmap自动化注入 sqlmap.py -u http://192.168.58.114:802/sqli-labs/Less-25/?id2 --batch -…