登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
Spark简介
Spark开发环境初始化
Spark运行架构与核心组件
Spark RDD详解
Spark RDD转换算子-单Value类型
Spark RDD转换算子-其他类型
Spark RDD行动算子
Spark Shuffle的设计思想
Spark SQL Hints用法总结
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
当前位置:
首页
>>
Spark
>>
Spark SQL Hints用法总结
Spark SQL Hints用法总结
2023-11-26 22:18:59 星期日 发表于北京 阅读:717
![](/static/images/article_images/1701008276.8606029.jpeg) #### Hint是什么? hint实际上一种特殊的注释,它以一种固定的格式和位置出现在sql语句的sql文本之中,**`它可以影响优化器对于执行计划的选择`**,但这种影响不是强制性的,优化器在某些情况下可能会忽略掉sql中的hint,及时这个hint在语法和语义上是有效的。 同理,在Spark SQL中也一样,在特定的查询场景中,通过Hint注释,能够大大提高Spark SQL的执行效率 #### Spark SQL支持的Hints种类 截止Spark3.5.0版本,支持的Hints用法主要有两大类,即: `分区 Hints` - 分区合并Hints - 重分区Hinis - 分区再均衡Hints `JOIN Hints` - 广播 JOIN Hints - 合并 JOIN Hints - SHUFFLE_HASH JOIN Hints - SHUFFLE_REPLICATE_NL Hints 下面一一介绍每种Hints的用法和示例 ### 一、Partitioning Hints 分区Hints为用户提供了一种调整Spark SQL性能和控制输出文件数量的方法。 当指定多个分区Hints时,多个节点将插入到逻辑计划中,但优化器会选择最左边的提示 ##### 1.1、分区合并Hints(COALESCE) COALESCE Hints可用于将分区数减少到指定的分区数。 用于查询的表小文件非常多的情况 ``` SELECT /*+ COALESCE(3) */ t.id, t.name FROM t; ``` ##### 1.2、普通重分区Hints 用于使用指定的分区表达式重新分区到指定数量的分区。 它采用分区号、列名或两者作为参数 ``` SELECT /*+ REPARTITION(3) */ t.id, t.name FROM t; SELECT /*+ REPARTITION(c) */ t.id, t.name FROM t; SELECT /*+ REPARTITION(3, c) */ t.id, t.name FROM t; ``` ##### 1.3、范围重分区Hints:REPARTITION_BY_RANGE 用于使用指定的分区表达式重新分区到指定数量的分区。 它采用列名和可选的分区号作为参数 ``` SELECT /*+ REPARTITION_BY_RANGE(c) */ t.id, t.name FROM t; SELECT /*+ REPARTITION_BY_RANGE(3, c) */ t.id, t.name FROM t; ``` ##### 1.4、分区再均衡Hints 用于重新平衡查询结果输出分区,使每个分区具有合理的大小(不太小也不太大) 它可以将列名作为参数,并尽力按这些列对查询结果进行分区。 如果存在倾斜,Spark 会分割倾斜的分区,以使这些分区不会太大。 当需要将此查询的结果写入表中时,此Hints很有用,以避免文件太小/太大 ``` SELECT /*+ REBALANCE */ t.id, t.name FROM t; SELECT /*+ REBALANCE(3) */ t.id, t.name FROM t; SELECT /*+ REBALANCE(c) */ t.id, t.name FROM t; SELECT /*+ REBALANCE(3, c) */ t.id, t.name FROM t; ``` ##### 1.5、多种Hints混用示例 ``` SELECT /*+ REPARTITION(100), COALESCE(500), REPARTITION_BY_RANGE(3, c) */ t.id, t.name FROM t; ``` ### 二、JOIN Hints Spark 3.0之前,仅支持BROADCAST Join Hint。 3.0 中添加了 MERGE、SHUFFLE_HASH 和 SHUFFLE_REPLICATE_NL 联合Hints支持。 当在JOIN两侧指定不同的连接策略提示时,Spark 将按以下顺序优先考虑提示:BROADCAST 优先于 MERGE 优先于 SHUFFLE_HASH 优先于 SHUFFLE_REPLICATE_NL。 当双方都使用 BROADCAST 提示或 SHUFFLE_HASH 提示指定时,Spark 将根据连接类型和关系的大小选择构建方。 由于给定策略可能不支持所有连接类型,因此 Spark 不保证使用提示建议的连接策略 ##### 2.1、BROADCAST Hints 用于建议Spark使用广播JOIN。 无论 autoBroadcastJoinThreshold 是多少,带有提示的加入端都会被广播。 如果连接的双方都有广播提示,则表较小的一方(基于统计数据)将被广播。 BROADCAST 的别名是 BROADCASTJOIN 和 MAPJOIN ``` SELECT /*+ BROADCAST(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key; SELECT /*+ BROADCASTJOIN (t1) */ * FROM t1 left JOIN t2 ON t1.key = t2.key; SELECT /*+ MAPJOIN(t2) */ * FROM t1 right JOIN t2 ON t1.key = t2.key; ``` ##### 2.2、MERGE Hints 用于建议Spark使用shuffle sort merge join。 MERGE 的别名是 SHUFFLE_MERGE 和 MERGEJOIN ``` SELECT /*+ SHUFFLE_MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key; SELECT /*+ MERGEJOIN(t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key; SELECT /*+ MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key; ``` ##### 2.3、SHUFFLE_HASH Hints 用于建议Spark使用shuffle hash join。 如果双方都有 shuffle 哈希提示,Spark 将选择较小的一方(基于统计数据)作为构建方。 ``` SELECT /*+ SHUFFLE_HASH(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key; ``` ##### 2.4、SHUFFLE_REPLICATE_NL Hints ``` SELECT /*+ SHUFFLE_REPLICATE_NL(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key; ``` ##### 2.5、不同的JOIN策略混用 当连接两侧指定不同的连接策略提示时,Spark 优先考虑 BROADCAST 提示、MERGE 提示、SHUFFLE_HASH 提示 -- 通过 SHUFFLE_REPLICATE_NL 提示。 -- Spark 在下面的例子中会发出警告 -- org.apache.spark.sql.catalyst.analysis.HintErrorLogger:提示(策略=合并) -- 被另一个提示覆盖并且不会生效。