Spark SQL----Hints

Spark SQL----Hints

  • 一、描述
  • 二、语法
  • 三、分区提示
    • [3.1 分区提示类型](#3.1 分区提示类型)
    • [3.2 例子](#3.2 例子)
  • [四、Join Hints](#四、Join Hints)
    • [4.1 Join提示类型](#4.1 Join提示类型)
    • [4.2 例子](#4.2 例子)

一、描述

提示(Hints)为用户提供了一种方法来建议Spark SQL如何使用特定的方法来生成其执行计划。

二、语法

sql 复制代码
/*+ hint [ , ... ] */

三、分区提示

分区提示允许用户建议Spark应该遵循的分区策略。支持COALESCE、REPARTITION和REPARTITION_BY_RANGE提示,它们分别相当于coalesce、repartition和repartitionByRange的 Dataset APIs。REBALANCE只能用作提示,这些提示给用户提供了一种优化性能和控制Spark SQL输出文件数量的方法。当指定多个分区提示时,会将多个节点插入到逻辑计划中,但优化器会选择最左边的提示。

3.1 分区提示类型

  • COALESCE
    COALESCE提示可用于将分区数量减少到指定的分区数量。它以分区编号作为参数。
  • REPARTITION
    REPARTITION提示可用于使用指定的分区表达式重新分区到指定数量的分区。它将分区号、列名或两者都作为参数。
  • REPARTITION_BY_RANGE
    REPARTITION_BY_RANGE提示可用于使用指定的分区表达式对指定数量的分区进行重新分区。它采用列名和可选的分区号作为参数。
  • REBALANCE
    REBALANCE提示可用于重新平衡查询结果输出分区,使每个分区都具有合理的大小(不太小也不太大)。它可以将列名作为参数,并尽最大努力按这些列对查询结果进行分区。这是一个best-effort:如果有倾斜,Spark会将倾斜的分区拆分,使这些分区不太大。当你需要将此查询的结果写入表以避免文件太小/太大时,此提示非常有用。如果未启用AQE,则忽略此提示。

3.2 例子

sql 复制代码
SELECT /*+ COALESCE(3) */ * FROM t;

SELECT /*+ REPARTITION(3) */ * FROM t;

SELECT /*+ REPARTITION(c) */ * FROM t;

SELECT /*+ REPARTITION(3, c) */ * FROM t;

SELECT /*+ REPARTITION_BY_RANGE(c) */ * FROM t;

SELECT /*+ REPARTITION_BY_RANGE(3, c) */ * FROM t;

SELECT /*+ REBALANCE */ * FROM t;

SELECT /*+ REBALANCE(3) */ * FROM t;

SELECT /*+ REBALANCE(c) */ * FROM t;

SELECT /*+ REBALANCE(3, c) */ * FROM t;

-- multiple partitioning hints
EXPLAIN EXTENDED SELECT /*+ REPARTITION(100), COALESCE(500), REPARTITION_BY_RANGE(3, c) */ * FROM t;
== Parsed Logical Plan ==
'UnresolvedHint REPARTITION, [100]
+- 'UnresolvedHint COALESCE, [500]
   +- 'UnresolvedHint REPARTITION_BY_RANGE, [3, 'c]
      +- 'Project [*]
         +- 'UnresolvedRelation [t]

== Analyzed Logical Plan ==
name: string, c: int
Repartition 100, true
+- Repartition 500, false
   +- RepartitionByExpression [c#30 ASC NULLS FIRST], 3
      +- Project [name#29, c#30]
         +- SubqueryAlias spark_catalog.default.t
            +- Relation[name#29,c#30] parquet

== Optimized Logical Plan ==
Repartition 100, true
+- Relation[name#29,c#30] parquet

== Physical Plan ==
Exchange RoundRobinPartitioning(100), false, [id=#121]
+- *(1) ColumnarToRow
   +- FileScan parquet default.t[name#29,c#30] Batched: true, DataFilters: [], Format: Parquet,
      Location: CatalogFileIndex[file:/spark/spark-warehouse/t], PartitionFilters: [],
      PushedFilters: [], ReadSchema: struct<name:string>

四、Join Hints

Join提示允许用户建议Spark应该使用的join策略。在Spark 3.0之前,仅支持BROADCAST Join Hint。3.0中增加了对MERGE、SHUFFLE_HASH和SHUFFLE_REPLICATE_NL Joint提示的支持。当在join的两侧都指定了不同的join策略提示时,Spark会按以下顺序对提示进行优先级排序:BROADCAST > MERGE > SHUFFLE_HASH > SHUFFLE_REPLICATE_NL。当两侧都使用BROADCAST提示或SHUFFLE_HASH提示时,Spark会根据join类型和relations的大小来选择构建侧。由于给定的策略可能不支持所有的join类型,因此不能保证Spark使用提示建议的join策略。

4.1 Join提示类型

  • BROADCAST
    建议Spark使用broadcast join。无论autoBroadcastJoinThreshold如何,都将广播带有提示的join端。如果join的两侧都有广播提示,则将广播大小较小的一个(基于统计数据)。BROADCAST的别名是BROADCASTJOIN和MAPJOIN。
  • MERGE
    建议Spark使用shuffle sort merge join。MERGE的别名是SHUFFLE_MERGE和MERGEJOIN。
  • SHUFFLE_HASH
    建议Spark使用shuffle hash join。如果双方都有huffle hash提示,Spark会选择较小的一方(基于统计数据)作为构建方。
  • SHUFFLE_REPLICATE_NL
    建议Spark使用shuffle-and-replicate nested loop join。

4.2 例子

sql 复制代码
-- Join Hints for broadcast join
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;

-- Join Hints for shuffle sort merge join
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;

-- Join Hints for shuffle hash join
SELECT /*+ SHUFFLE_HASH(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- Join Hints for shuffle-and-replicate nested loop join
SELECT /*+ SHUFFLE_REPLICATE_NL(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;

-- When different join strategy hints are specified on both sides of a join, Spark
-- prioritizes the BROADCAST hint over the MERGE hint over the SHUFFLE_HASH hint
-- over the SHUFFLE_REPLICATE_NL hint.
-- Spark will issue Warning in the following example
-- org.apache.spark.sql.catalyst.analysis.HintErrorLogger: Hint (strategy=merge)
-- is overridden by another hint and will not take effect.
SELECT /*+ BROADCAST(t1), MERGE(t1, t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
相关推荐
imbackneverdie33 分钟前
知网官宣:禁止 AI 列为论文署名作者,标注 Gemini、DeepSeek 等 AI 为作者的稿件统一下架
大数据·人工智能·ai·职场和发展·aigc·科研·高校
@insist1231 小时前
信息系统管理工程师-数字化转型成熟度模型核心考点解析
大数据·人工智能·软考·软件水平考试·信息系统管理工程师·软考信管
AvatarAI_Walker1 小时前
2026年7月安徽健康 IP 孵化:四家机构服务特点与场景关注方向梳理
大数据·人工智能·tcp/ip·精选
sbjdhjd1 小时前
SQL 注入零基础详解:原理、手工注入流程与 Sqli-Labs 靶场实战1~5关和第9关思路
数据库·sql·计算机网络·web安全·网络安全·网络攻击模型·安全架构
栋***t1 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
java_logo2 小时前
Docker Compose 部署 Apache Superset:轻松搭建开源 BI 平台
docker·开源·apache·superset·轩辕镜像·superset部署方案·docker superset
Xzaveir_7772 小时前
企业号码负面标记治理:认证、申诉与合规事件的三轨模型
大数据·网络·人工智能·科技·产品经理
hnsoyon3 小时前
智慧管廊综合管理平台赋能排水管网监测精细化管理
大数据·人工智能·智慧管廊综合管理平台·排水管网监测
数智化管理手记3 小时前
预算控制手工核对效率低?预算控制数字化落地实操如何做?
大数据·网络·数据库·人工智能·数据挖掘
慾玄3 小时前
sql注入靶场1-5,9关
数据库·sql