Hive 中 on和where的区别

Hive中left join 中的where 和 on的区别 阅读详情

Hive 中 ON 和 WHERE 的区别

✅ 核心区别总结

维度ONWHERE
作用时机JOIN 时过滤JOIN 后过滤
影响结果影响 JOIN 逻辑不影响 JOIN 逻辑
适用范围JOIN 操作所有查询
性能影响早期过滤,性能好晚期过滤,性能差

✅ 详细对比分析

1. 执行时机差异

ON 条件 - JOIN 时执行
-- ON 条件在 JOIN 阶段执行
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id AND b.status = 'active';
  • 执行逻辑:先根据 a.id = b.id 和 b.status = 'active' 进行 JOIN
  • 结果:LEFT JOIN 中,不满足 b.status = 'active' 的 b 表记录不会 JOIN 进来
WHERE 条件 - JOIN 后执行
-- WHERE 条件在 JOIN 完成后执行
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id
WHERE b.status = 'active';
  • 执行逻辑:先完成 JOIN,再过滤结果
  • 结果:LEFT JOIN 变成 INNER JOIN 效果(因为 WHERE 过滤了 NULL 记录)

2. 对不同 JOIN 类型的影响

A. INNER JOIN - 效果相同
-- 这两种写法结果相同
SELECT a.*, b.*
FROM table_a a
INNER JOIN table_b b ON a.id = b.id AND b.status = 'active';

SELECT a.*, b.*
FROM table_a a
INNER JOIN table_b b ON a.id = b.id
WHERE b.status = 'active';
B. LEFT/RIGHT JOIN - 效果不同
-- ON 条件:保留 a 表所有记录
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id AND b.status = 'active';
-- 结果:a 表所有记录都保留,b 表不匹配的为 NULL

-- WHERE 条件:LEFT JOIN 变成 INNER JOIN
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id
WHERE b.status = 'active';
-- 结果:只保留 b.status = 'active' 的记录

3. 性能影响

ON 条件 - 早期过滤
-- 推荐:在 JOIN 时就过滤
SELECT a.*, b.*
FROM large_table a
LEFT JOIN small_table b ON a.id = b.id AND b.category = 'important';
-- 优点:减少 JOIN 操作的数据量
WHERE 条件 - 晚期过滤
-- 不推荐:先 JOIN 再过滤
SELECT a.*, b.*
FROM large_table a
LEFT JOIN small_table b ON a.id = b.id
WHERE b.category = 'active';
-- 缺点:JOIN 完成后才过滤,数据量大

4. 实际业务场景示例

场景 A:用户与订单统计
-- 需求:统计所有用户订单数,只统计有效订单
CREATE TABLE users (user_id STRING, name STRING);
CREATE TABLE orders (order_id STRING, user_id STRING, status STRING);

-- ✅ 正确:使用 ON 过滤有效订单
SELECT u.name, COUNT(o.order_id) as order_count
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id AND o.status = 'completed'
GROUP BY u.user_id, u.name;

-- ❌ 错误:使用 WHERE 会丢失无订单用户
SELECT u.name, COUNT(o.order_id) as order_count
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE o.status = 'completed'  -- 这样 LEFT JOIN 变成 INNER JOIN
GROUP BY u.user_id, u.name;
场景 B:维度表关联
-- 需求:关联商品信息,只保留有效商品
SELECT s.*, p.product_name
FROM sales s
LEFT JOIN products p ON s.product_id = p.product_id AND p.is_active = 'Y';

-- 如果用 WHERE:
SELECT s.*, p.product_name
FROM sales s
LEFT JOIN products p ON s.product_id = p.product_id
WHERE p.is_active = 'Y';  -- 丢失非活跃商品的销售记录

5. 性能优化建议

A. 过滤条件前移
-- ✅ 优化:将过滤条件放在 ON 中
SELECT a.*, b.*
FROM big_table a
JOIN small_table b ON a.id = b.id 
  AND b.status = 'active' 
  AND b.category IN ('A', 'B');

-- ❌ 非优化:过滤条件放在 WHERE
SELECT a.*, b.*
FROM big_table a
JOIN small_table b ON a.id = b.id
WHERE b.status = 'active' AND b.category IN ('A', 'B');
B. 复合条件处理
-- ✅ 复杂条件合理分配
SELECT a.*, b.*, c.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.a_id AND b.process_date >= '2024-01-01'
LEFT JOIN table_c c ON a.id = c.a_id AND c.status = 'valid'
WHERE a.dt = '2024-11-06';  -- 时间分区过滤

6. 特殊情况处理

A. 多个 JOIN 条件
-- ✅ 正确:每个 JOIN 的过滤条件放在对应 ON 中
SELECT *
FROM table_a a
LEFT JOIN table_b b ON a.id = b.a_id AND b.status = 'active'
LEFT JOIN table_c c ON a.id = c.a_id AND c.category = 'important'
WHERE a.create_time > '2024-01-01';
B. NULL 值处理
-- ON 条件对 NULL 的影响
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id AND b.name IS NOT NULL;
-- 结果:b.name 为 NULL 的记录不会 JOIN 进来

-- WHERE 条件对 NULL 的影响
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id
WHERE b.name IS NOT NULL;
-- 结果:LEFT JOIN 变成 INNER JOIN

📌 面试总结

ON 和 WHERE 的核心区别:

  1. 执行时机:ON 在 JOIN 时执行,WHERE 在 JOIN 后执行
  2. 对结果影响:ON 影响 JOIN 逻辑,WHERE 不影响 JOIN 类型
  3. 性能:ON 早期过滤性能更好
  4. 最佳实践:JOIN 相关过滤用 ON,全局过滤用 WHERE

记忆口诀:ON 控制 JOIN,WHERE 控制结果

Hive中join条件过滤on和where的区别 1、inner join inner join首先可以通过分区进行过滤,防止全表扫描。 inner join会自动为join的键(on d.id=u.department_id)添加is not null的过滤条件 inner join 下on和where后面的条件进行过滤,在inner join中where和on是同时进行过滤,没有顺序的区别 2、left/right join left/right join使用分区条件过滤,可以防止全表扫描,最优先过滤 left/right join在主表下进 阅读详情

相关推荐

hive-spark-client-3.1.2.jar

hive-on-spark客户端

Hive On Spark 概述、安装配置、计算引擎更换、应用、异常解决

Hive On Spark 概述、安装配置、计算引擎更换、应用、异常解决

JIE的博客 --- moon_coder 1万+

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 82

SQL中条件放在on后与where后的区别

SQL中on条件与where条件的区别          数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。       在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条...

weixin_34074740的博客 1140

瑞芯微Android固件修改实战:从解包到root提权完整流程(附工具包)

本文详细解析了瑞芯微Android固件深度定制全流程,涵盖从固件包解包、系统镜像修改到植入root提权与分区调整的实战步骤。通过工具链操作与原理剖析,指导开发者安全实现系统精简、权限获取及存储扩容,最终完成固件重新打包与刷机验证,适用于追求设备完全控制权的技术爱好者。

ujm56789012的博客 697

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本文介绍哨兵1号用的FDBAQ算法,它实现非整数可变bit压缩,大部分数据仅需 3bit输出,少数高反射率数据需4bit输出,使得平均输出比特率刚超过3bit,比熵约束分块自适应量化 (ECBAQ)压缩算法所需的3.7bit更低。也就是说FDBAQ压缩完,除了要记录分块尺寸和各块的均值码(对应哨兵1号数据包里的THIDX)外,还需要记录霍夫曼码字的长度(对应哨兵1号数据包里的BRC)。唯一不同的就是量化后的编码规则使用了霍夫曼编码,相当于在传统的BAQ压缩流程的后面又加了一个步骤。

2302

一文弄懂Hive中谓词下推(on与where的区别)

Hive谓词下推与where和on的使用时机,一文就能理解透彻

a805814077的博客 6499

前端Three.js面试题及参考答案

渲染循环(Render Loop)是 Three.js 中一个非常重要的概念,它是一个不断重复执行的过程,用于更新和渲染 3D 场景。在每次循环中,渲染循环会更新场景中的对象状态,如位置、旋转、缩放等,然后使用渲染器将更新后的场景渲染成 2D 图像显示在屏幕上。通过不断地重复这个过程,就可以实现动画效果。渲染循环的核心作用是确保场景能够实时更新,给用户带来流畅的视觉体验。如果没有渲染循环,场景将是静态的,不会有任何变化。只有通过不断地更新和渲染,才能让场景中的对象动起来,实现各种动画效果。

大模型大数据攻城狮的专栏 2722

Hive on Spark环境搭建

Hive 引擎包括:默认 MR、tez、spark最底层的引擎就是MR (Mapreduce)无需配置,Hive运行自带Hive on Spark:Hive 既作为存储元数据又负责 SQL 的解析优化,语法是 HQL 语法,执行引擎变成了 Spark,Spark 负责采用 RDD 执行。Spark on Hive : Hive 只作为存储元数据,Spark 负责 SQL 解析优化,语法是 Spark SQL语法,Spark 负责采用 RDD 执行。

TH_NUM的博客 4545

如何使用PostgreSQL数据库进行数据仓库的ETL操作

本文旨在为数据工程师、数据库管理员和分析师提供使用PostgreSQL进行数据仓库ETL操作的全面指南。ETL流程的基本原理PostgreSQL在ETL中的独特优势实际ETL实现的技术细节性能优化和最佳实践常见问题的解决方案首先介绍ETL和PostgreSQL的基本概念然后深入探讨核心技术和实现方法接着提供实际案例和代码示例最后讨论优化技巧和未来趋势ETL:提取(Extract)、转换(Transform)、加载(Load)的缩写,描述数据从源系统移动到目标数据仓库的过程。

2502_91592937的博客 873

YOLO26优化:注意力魔改 | SKAttention注意力,自适应地调整其感受野大小,效果优于SENet

SKAttention输入自适应地调整其感受野大小的能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 249

Hive SQL查询left join下on条件和where条件区别

我们通常的认知是联表查询时ON是作用于联表前(时)的过滤条件,WHERE是对联表后的数据的过滤条件,但hive sql查询有个特殊点需要关注,那就是对于left join中的左表ON过滤条件有可能会被忽略,比如 SELECT DISTINCT a.dt FROM wlxdw.dws_tuid_cheat_di a LEFT JOIN wlxdw.apps_tuid_device_map_ds b ON a.tuid = b.tuid AND a.dt='2021-10-18' AND b.dt='202

zhang197093的博客 5107

12027.linux flash驱动之IS25LP01G/IS25WWP01G

一页:512字节 --> 扇区 4096字节 --> 块 32k,64k, 层层递进关系。

写给自己的笔记 2289

hive join on 条件 与 where 条件区别

hive join on 条件 与 where 条件区别 1. select * from a left join b on a.id = b.id and a.dt=20181115; 2. select * from a left join b on a.id = b.id and b.dt=20181115; 3. select * ...

weixin_30832983的博客 445

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2972

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Hive条件在on和where后面区别

hive左关联时过滤条件在on和where后面的区别

qq_35790439的博客 1754

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Hive中 join on筛选条件 与 where筛选条件的区别

测试两张表结构: create table px_data_test_temp.test_score( id int comment '学生id', grade int comment '学生成绩' ) comment '学生成绩表'; create table px_data_test_temp.test_stu( id int comment '学生id', name string comment '学生姓名' ) comment '学生信息表'; 插入测试数据: insert into

雾岛与鲸的博客 2359

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hive join on和where条件之间的区别

hive> select ljn001.*,ljn002.*> from ljn001 left outer join ljn002 > on (ljn001.a = ljn002.a and ljn001.b = ljn002.b and ljn001.b = 2); OK aba b 12...

210

SQL(hive也适用)中条件放在on后与where后的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须...

翻滚吧->阿城的博客 1699

Hive sql中条件写在on和where的区别

三、对于inner join 在on上写主表a或者副表b的条件,都会生效,和写在where里结果一样。二、对于left join,在on上写副表b的条件会生效,但是语义与写到where 条件不同。一、对于left join,如果在on上写a表的条件,则该条件不会生效,依旧会全局扫描。

Matrix_cc的博客 766

Hive中四种 join on筛选条件与where筛选条件的区别

tableA的结构及数据: id name grade dept 1 lijie1 100.0 10 2 lijie2 90.0 20 3 lijie3 60.0 10 4 lijie4 80.0 10 5 lijie5 70.0 20 tableB的结构及数据: id name 1...

风 1万+

Hive Left Join 中 On 与 Where 的区别

条件写在on里,join的时候处理,满足条件的join,不满足条件的不join,但是都会显示 条件写在where里,join完了处理,满足条件的显示,不满足条件的不显示 参考文献: https://blog.youkuaiyun.com/qq_20641565/article/details/52950087 ...

219

hive过滤条件on和过滤条件where的区别

过滤条件on:指的是join后面on的具体内容,例如: on t1.age>=20 过滤条件where:指的是where条件后面的内容,例如:where t1.age>=20 我们来看具体结果,到底有什么不同? 案例1:过滤条件on spark-sql> with test1 as ( > select 1 as user_id,'xiaoming' as name > union all > select 2 .

程老师的博客 2284

被问麻了:Hive过滤条件写在where和on里到底有什么区别?

但是条件在on 中时,在扫表时过滤,结果的数据条数与左表一致;条件在where中时,在join后进行过滤,结果的数据会过滤掉关联后右表不满足条件的数据,会比左表数据量少。无论是过滤左表、右表 - on 、where 的结果都一样,全都在扫表时过滤,若是左表条件则过滤左表,若是右表条件则过滤右表。过滤条件是否针对关联键、left join的情况下过滤条件针对左表还是右表、过滤条件在where中还是on中。无论是过滤左表、右表- on 、where 的结果都一样,全都在扫表时过滤,过滤两表。

baishao_的博客 1167
上一篇: Hive主要有几种存储格式&压缩方式
下一篇: 如何通过hive执行计划了解sql执行过程
走过冬季
博客等级 码龄9年 1609粉丝 341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值