HIVE:谓词下推

谓词

指返回bool值即true和false的函数,或是隐式转换为bool的函数:

如SQL中的谓词主要有 LKIE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS

谓词下推 Predicate Pushdown(PPD):

谓词下推 Predicate Pushdown(PPD),简而言之,就是在不影响结果的情况下,尽量将过滤条件提前执行。谓词下推后,过滤条件在map端执行,减少了map端的输出,降低了数据在集群上传输的量,节约了集群的资源,也提升了任务的性能。

谓词下推的基本思想 :将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。

下面是join条件中的四个常见的概念:

  1. 保留行表:在外关联语句中返回所有行的表. 比如a left (outer) join b 中的 a 表; a right (outer) join b 中的 b 表; a full outer join b a 和 b 表都是 保留表。
  2. NULL补充表:外关联语句中用null值来填充没有匹配行的表. 比如a left (outer) join b 中的 b 表; a right (outer) join b 中的 a 表,a full outer join b a 和 b 表都是 null值保留表
  3. Join中谓词:在Join on条件中的谓词.
  4. Join后谓词:在Where条件中的谓词.

谓词下推法则

第一条法则: join条件过滤不能下推到保留行表中。

比如以下选择,left join中左表s1为保留行表,所以on条件(join过滤条件)不能下推到s1中

select s1.key, s2.key from src s1 left join src s2 on s1.key > '2';

而s2表不是保留行,所以s2.key>2条件可以下推到s2表中:

select s1.key, s2.key from src s1 left join src s2 on s2.key > '2';

第二条法则:where条件过滤不能下推到NULL补充表。

比如以下选择left join的右表s2为NULL补充表所以,s1.key>2 where条件可以下推到s1:

select s1.key, s2.key from src s1 left join src s2 where s1.key > '2';

而以下选择由于s2为NULL补充表所以s2.key>2过滤条件不能下推

select s1.key, s2.key from src s1 left join src s2 where s2.key > '2';

注意:如果在表达式中含有不确定函数,整个表达式的谓词将不会被pushed

例如

select a.*

from a join b on a.id = b.id

where a.ds = '2019-10-09' and a.create_time = unix_timestamp();

因为unix_timestamp是不确定函数,在编译的时候无法得知,所以,整个表达式不会被pushed,即ds='2019-10-09'也不会被提前过滤。类似的不确定函数还有rand()等。

相关推荐
千月落1 小时前
HDFS数据迁移
大数据·hadoop·hdfs
RestCloud12 小时前
ETL数据质量保障:如何通过优化提升数据准确性?
数据仓库·etl·数据处理·数据传输·数据同步·数据集成平台
隐于花海,等待花开21 小时前
40.RAND 函数深度解析
hive·hadoop
2501_927283582 天前
荣联汇智助力天津艺虹打造“软硬一体”智慧工厂,全流程自动化引领印刷包装行业数智变革
大数据·运维·数据仓库·人工智能·低代码·自动化
孤雪心殇2 天前
快速上手数仓基础知识
数据仓库·hive·spark
渣渣盟2 天前
数据仓库 vs 数据湖 vs 湖仓一体:架构演进与选型
数据仓库·架构
隐于花海,等待花开2 天前
39.ROUND / FLOOR / CEIL 函数深度解析
hive·hadoop
juniperhan2 天前
Flink 系列第22篇:Flink SQL 参数配置与性能调优指南:从 Checkpoint 到聚合优化
大数据·数据仓库·分布式·sql·flink
juniperhan2 天前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
看海的四叔3 天前
【SQL】SQL-管好你的字符串
大数据·数据库·hive·sql·数据分析·字符串