Hive查询操作

news2024/10/7 14:33:50

Hive基本查询语法

基本使用规则

基本查询语句组成

select ..
from ..
    join [tableName] on ..
    where ..
    group by ..
    having ..
    order by ..
    sort by ..
    limit ..
union | union all ...

执行顺序

第一步: FROM <left_table>
第二步: ON <join_condition>
第三步: <join_type> JOIN <right_table>
第四步: WHERE <where_condition>
第五步: GROUP BY <group_by_list>
第六步: HAVING <having_condition>
第七步: SELECT
第八步: DISTINCT <select_list>
第九步: ORDER BY <order_by_condition>
第十步: LIMIT <limit_number>

标准sql语句的一些规则:
-1. 列别名的使用,必须完全符合执行顺序,不能提前使用。(mysql除外)
-2. 在分组查询时,select子句中只能含有分组字段和聚合函数,不能有其他普通字段。(mysql除外)

查询原则

1. 尽量不使用子查询、尽量不使用in 或者not in (可以使用 [not] exists替代)
2. 尽量避免join连接查询,但是通常避免不了
3. 查询永远是小表驱动大表(小表作为驱动表)
  --注意:内连接时,默认是左表是驱动表,因此左表一定要是小表。
  --	 外连接看需求而定。  

常用子句回顾

where语句特点

where后不能使用聚合函数,可以使用子查询,也可以是普通函数。
条件可以是:
1. 关系表达式: =, >,>=,<,<=,!=,<>
2. 连接符号:  or,and, between .. and ..
3. 模糊查询: like   
             %:通配符
             _:占位符
4. [not] in
    >all(set)  >any();

注意事项:在hive的where中如果使用了子查询作为条件,等号“=”不好使,需要使用[not] in.
        换句话说,即使子查询返回的是唯一的一个值,也是集合形式。

group by语句特点

group by: 分组,通常和聚合函数搭配使用

查询的字段要么出现在group by 后面,要么出现在聚合函数里面

聚合函数:count(),sum(),max(),min(),avg()

count的执行
1. 执行效果上:
    - count(*)包括了所有的列,相当于行数,在统计结果的时候不会忽略null值
    - count(1)包括了所有列,用1代表行,在统计结果的时候也不会忽略null值
    - count(列名)只包括列名那一列,在统计结果时,会忽略null值

2.执行效率上:
    - 列名为主键,count(列名)会比count(1)快
    - 列名不为主键,count(1)会比count(列名)快
    - 如果表中有多个列并且没有主键,count(1)的效率高于count(*)
    - 如果有主键count(主键)效率是最高的
    - 如果表中只有一个字段count(*)效率最高

having子句特点

对分组以后的结果集进行过滤。可以使用聚合函数。

order by子句

对查询的数据进行排序。
desc 降序
asc	 升序

语法:
order by colName [desc|asc][,colName [desc|asc]]

limit语句特点

limit : 从结果集中取数据的条数
将set hive.limit.optimize.enable=true 时,limit限制数据时就不会全盘扫描,而是根据限制的数量进行抽样。

同时还有两个配置项需要注意:
hive.limit.row.max.size=100000        这个是控制最大的抽样数量【默认值是100000】
hive.limit.optimize.limit.file=10 这个是抽样的最大文件数量【默认值是10个】
缺点:可能输入中有用的数据永远都不会被抽样到。

注意:limit 在mysql中 可以有两个参数 limit [m,] n
           在hive中,只能有一个参数 limit n;  查询前n条。
      一般情况下,在使用limit时,都会先order by排序。

join连接

join知识点回顾

有的业务所需要的数据,不是在一张表中,通常会存在多张表中,而这些表中通常应该会存在"有关系"的字段。多表查询时,使用关联字段"连接"(join)在一起,组合成一个新的数据集,就是连接查询。

连接查询操作分为两大类:内连接和外连接,而外连接有细分为三种类型。参考下图

1. 内连接:  [inner] join
2. 外连接 (outer join):(引出一个驱动表的概念:驱动表里的数据全部显示)
  - 左外连接:left [outer] join, 左表是驱动表
  - 右外连接:right [outer] join, 右表是驱动表
  - 全外连接:full [outer] join, hive支持,mysql不支持.两张表里的数据全部显示出来
3. 注意: join连接只支持等值连接

需要大家注意的是,两张表的关联字段的值往往是不一致的。比如,表 A 包含张三和李四,表 B 包含李四和王五,匹配的只有李四这一条记录。从上图很容易看出,一共有四种处理方式和结果。下图就是四种连接的图示,这张图比上面的维恩图更易懂,也更准确。

join

上图中,表 A 的记录是 123,表 B 的记录是 ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用 null 填充,这四种连接,又可以分成两大类:内连接(inner join)表示只包含匹配的记录,外连接(outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接都属于外连接。

笛卡尔积

指的是表 A 和表 B 不存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张包含 n x m 条记录(笛卡尔积)的新表。

cross

案例演示:

准备数据
u1文件中的数据如下:
1,a
2,b
3,c
4,d
7,y
8,u

u2文件中的数据如下:
2,bb
3,cc
7,yy
9,pp

create table if not exists u1(
id int,
name string
)
row format delimited 
fields terminated by ','
;

create table if not exists u2(
id int,
name string
)
row format delimited fields terminated by ','
;

load data local inpath './data/u1.txt' into table u1;
load data local inpath './data/u2.txt' into table u2;

left semi join

在hive中,有一种专有的join操作,left semi join,我们称之为半开连接。它是left join的一种优化形式,只能查询左表的信息,主要用于解决hive中左表的数据是否存在的问题。相当于exists关键字的用法。

先回顾exists关键字的用法:exists关键字:满足条件返回true,不满足条件返回false

练习:  
查询有领导的员工信息
      select * from emp where mgr is not null
      select * from emp A where exists (select 1 from emp B where B.empno = A.mgr )	
      select * from emp A left semi join emp B on A.mgr = B.empno;
      
查询有下属的员工信息
      select * from emp A where exists (select 1 from emp B where B.mgr = A.empno )
      
查看有部门的所有员工的信息
      select * from emp A where exists (select 1 from dept B where B.deptno = A.deptno )

left semi join的写法。

-- 左外连接,左表中的数据全部返回
select * from u1 left join u2 on u1.id =u2.id;
select * from u1 left outer join u2 on u1.id =u2.id;
-- 左半开连接,只显示左表中满足条件的数据。和exists的逻辑是相同的
select * from u1 left semi join u2 on u1.id =u2.id;
-- exists的写法
select * from u1 where exists (select 1 from u2 where u2.id =u1.id);

--验证left semi join 是否可以显示第二张表的信息:错误写法。
select A.*, B.* from u1 A left semi join u2 B on A.id =B.id;

注意 hive中不支持right semi join

更多大数据精彩内容欢迎B站搜索“千锋教育”或者扫码领取全套资料 

【千锋教育】大数据开发全套教程,史上最全面的大数据学习视频

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python使用matplotlib库绘制数学函数

** 任务一&#xff1a;使用matplotlib绘制yx的曲线图 ** matplotlib是python的绘画库&#xff0c;它可以与NumPy一起使用&#xff0c;提供了一种轻量级的MatLab开源高效替代方案。它可以和图形工具包PyQt等工具 一起配合使用&#xff0c;能够完成日常科学计算中多种数学库图可…

RuoYi(分离版) 使用代码生成器添加子模块(idea版)

右键总文件夹&#xff0c;选择新模块添加新模块 新建的业务模块 新建的业务模块中添加若依通用模块工具 <dependencies><dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-common</artifactId></dependency></depen…

窨井水位监测的重要性

窨井是排水管网的检查井&#xff0c;能够直观准确的反映城市排水管网的运行状态&#xff0c;在城市排水系统中扮演着重要的角色。窨井水位监测是指对城市下水道或雨水收集系统中的窨井水位进行实时或定期的监测和测量。 窨井水位监测的重要性 预防溢流&#xff1a;窨井水位监测…

Nacos 无缝支持 confd 配置管理

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Android Studio实现内容丰富的安卓物业管理平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号102 1.开发环境 android stuido3.6 jak1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告…

调用接口异常的原因及解决方法

在进行接口调用时&#xff0c;调用有时会遇到各种异常情况&#xff0c;接口解决例如连接超时、异常因及返回值错误等。调用的原这些异常情况可能会导致程序无法正常运行&#xff0c;接口解决因此需要及时解决。异常因及本文将介绍。调用的原 一、接口解决连接超时 连接超时是异…

面试题-Spring 面试集

Spring 面试集 基于Spring Framework 4.x 总结的常见面试题&#xff0c;系统学习建议还是官方文档走起&#xff1a;https://spring.io/projects/spring-framework#learn 一、一般问题 开发中主要使用 Spring 的什么技术 ? IOC 容器管理各层的组件 使用 AOP 配置声明式事务 整…

Vue2+vue-cli使用Tailwind CSS

1.执行以下命令安装依赖 npm install tailwindcssnpm:tailwindcss/postcss7-compat tailwindcss/postcss7-compat postcss^7 autoprefixer^92.cmd执行命令npm i 下载项目所用到的依赖 npm i3.在项目根目录下创建一个 postcss.config.js 文件 module.exports {plugins: [requ…

fcpx插件:Kingluma Radiance(发光和光线过渡效果)

Kingluma Radiance是一款为Final Cut Pro X&#xff08;FCPX&#xff09;设计的插件&#xff0c;它提供了丰富的光效和发光效果&#xff0c;可用于增强视频的视觉效果。 Radiance插件为用户提供了多种发光效果和光晕效果&#xff0c;如光晕、镜头光晕、梦幻效果等。它具有直观的…

推荐信模版(英文)计算机专业

推荐信模版&#xff08;英文&#xff09;计算机专业 ✅ 内容已校对 润色 ©️ 文章来源&#xff1a;https://blog.csdn.net/IYXUAN&#xff0c;原创内容&#xff0c;转载请注明&#xff01; 推荐信&#xff08;一&#xff09; January 4, 2023 Dear Admissions Committe…

7.4黄金能否继续上行?今日行情如何发展

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周二(7月4日)亚市早盘&#xff0c;美元指数继续承压&#xff0c;目前略低于103关口;现货黄金保持在1923美元/盎司附近。由于悲观的美国数据未能支持美联储的鹰派倾向…

node获取文件夹下所有js文件的模块

创建 index.js const fs require(fs) const path require(path)const folderPath path.join(__dirname, api)console.log(目录路径&#xff1a;, folderPath)let moduleObj {}fs.readdirSync(folderPath).forEach((file) > {const filePath path.join(folderPath, file…

C语言指针基础

目录 前言 本期介绍内容&#xff1a; 一、指针是什么&#xff1f; 二、指针和指针类型 指针类型的意义&#xff1a; 三、野指针 3.1什么是野指针&#xff1f; 3.2野指针的成因 1.指针未初始化 2.指针越界访问 3.指针指向的那块空间已经释放&#xff08;还给操作系统了…

图像处理--边缘检测算子

算子推导过程 1、知识引入&#xff1a; 在一维连续数集上有函数f(x),我们可以通过求导获得该函数在任一点的斜率&#xff0c;根据导数的定义有&#xff1a; 在二维连续数集上有函数f(x,y),我们也可以通过求导获得该函数在x和y分量的偏导数&#xff0c;根据定义有&#xff1a; …

更改VS code Jupyter 插件的默认快捷键

更改vscode 中Jupyter插件的默认快捷键&#xff0c;解放插入空行的系统快捷键 替换Jupyter默认快捷键 更改vscode 中Jupyter插件的默认快捷键&#xff0c;解放插入空行的系统快捷键打开keyboard shortcuts 设置方法一方法二 更换快捷键 end Jupyter 插件很好的在VS code中集成了…

在私家车上安装车载电台合法吗?

答案是合法的&#xff0c;不过需要办理相关手续才行。想在自己的车上安装车载无线电台&#xff0c;需要先考取一个业余无线电操作证&#xff0c;然后再将车载电台拿到当地的无线电管理委员会进行验机&#xff0c;如果符合业余广播电台的机器要求&#xff0c;将颁发《中华人民共…

淘宝数据采集员(如何快速高效地采集淘宝数据)

目录 淘宝数据采集的重要性 淘宝数据采集的意义 淘宝数据采集的应用场景 淘宝数据采集的流程 淘宝数据采集的准备工作 淘宝数据采集的技巧与注意事项 淘宝数据采集的工具推荐 淘宝数据采集的流程 如何快速高效地采集淘宝数据 淘宝数据采集的注意事项 淘宝数据采集的重…

安装qt qmake assistant 错误:could not find a Qt installation of ‘‘

1、执行qmake,提示下图的错误 Command qmake not found, but can be installed with: sudo apt install qtchooser 解决方法&#xff1a; sudo apt install qtchooser 2、执行qmake,提示一下错误 qmake: could not find a Qt installation of 解决步骤&#xff1a; 步骤一&a…

spring源码分析-ApplicationContext----扩展组件event listener

我们知道 spring中的ApplicationContext在beanFactory(提供基础bean处理)基础上增加了扩展组件&#xff0c;例如国际化&#xff0c;资源&#xff0c;发布事件和监听事件&#xff0c;今天主要针对发布和监听事件做一次源码分析&#xff0c;看到底发布和监听是如何实现的&#xf…

Promise的常见面试题

四、相关面试题 1. 多个 .catch var p new Promise((resolve, reject) > {reject(Error(The Fails!)) })p.catch(error > console.log(error.message)) p.catch(error > console.log(error.message))以上代码的输出将会是什么&#xff1f; 打印两次 The Fails! 解析…