写点什么

题目一: 分析一条 TPCDS SQL

作者:arctec
  • 2021 年 11 月 18 日
  • 本文字数:1325 字

    阅读完需:约 4 分钟

分析一条 TPCDS SQL (请基于 Spark 3.1.1 版本解答)

SQL 从中任意选择一条:

https://github.com/apache/spark/tree/master/sql/core/src/test/resources/tpcds

(1)运行该 SQL ,如 q38 ,并截图该 SQL 的 SQL 执行图

(2)该 SQL 用到了哪些优化规则( optimizer rules )

(3)请各用不少于 200 字描述其中的两条优化规则


(1)帮助文档:如何运行该 SQL

1. 从 github 下载 TPCDS 数据生成器

>git clone https://github.com/maropu/spark-tpcds-datagen.git

>cd spark-tpcds-datagen

2. 下载 Spark3.1.1 到 spark tpcds datagen 目录并解压

>wget https://archive.apache.org/dist/spark/spark-3.1.1/spark 3.1.1-bin-hadoop2.7.tgz

>tar -zxvf spark 3.1.1-bin-hadoop2.7.tgz

3. 生成数据

mkdir -p tpcds-data-1g

>export SPARK_HOME=./spark-3.1.1-bin-hadoop2.7

>./bin/dudgen --output-location tpcds-data-1g

4. 下载三个 test jar 并放到当前目录

>wget

https://repo1.maven.org/maven2/org/apache/spark/spark catalyst_2.12/3.1.1/spark-catalyst_2.1

2 3.1.1-tests.jar

>wget

https://repo1.maven.org/maven2/org/apache/spark/spark core_2.12/3.1.1/spark-core_2.12-3.1.1-tests.jar

>wget

https://repo1.maven.org/maven2/org/apache/spark/spark sql_2.12/3.1.1/spark-sql_2.12-3.1.1-te

sts.jar

5. 执行 SQL

spark-submit --class

org.apache.spark.sql.execution.benchmark.TPCDSQueryBenchmark --jars

spark-core_2.12-3.1.1-tests.jar,spark-catalyst_2.12-3.1.1-tests.jar

spark-sql_2.12-3.1.1-tests.jar --data-location tpcds data-1g --query-filter "q73"

(2)执行结果:该 SQL 用到了如下优化规则

org.apache.spark.sql.catalyst.optimizer.ColumnPruning

org.apache.spark.sql.catalyst.optimizer.ReplaceIntersectWithSemiJoin

org.apache.spark.sql.catalyst.optimizer.ReplaceDistinctWithAggregate

org.apache.spark.sql.catalyst.optimizer.ReorderJoin

org.apache.spark.sql.catalyst.optimizer.PushDownPredicates

org.apache.spark.sql.catalyst.optimizer.PushDownLeftSemiAntiJoin

org.apache.spark.sql.catalyst.optimizer.CollapseProject

org.apache.spark.sql.catalyst.optimizer.EliminateLimits

org.apache.spark.sql.catalyst.optimizer.ConstantFolding

org.apache.spark.sql.catalyst.optimizer.RemoveNoopOperators

org.apache.spark.sql.catalyst.optimizer.InferFiltersFromConstraints

org.apache.spark.sql.catalyst.optimizer.RewritePredicateSubquery

(3) 选择 PushDownPredicates 和 ReorderJoin 这两条规则

  • PushDownPredicates 这个规则通过其他的操作把 filter 操作下推到离数据源更近的地方,将计算转移至数据源端,减少 spark 加载和计算的数据量,但不是所有的操作都支持。

  • ReorderJoin 这个规则是对 Join 操作进行重新排列,有两种做法。一种是逻辑上的转换,即将在 where 中涉及到两个表关联或者 filter 的条件提前至相应的 join 操作中,减少参与 join 的数据量以及最终 join 结果的数据量。还有一种做法是基于成本的做法,通过启用成本优化器,以及对 join 的表进行统计,spark 会根据 join 的成本选择代价最小的 join 方式。


用户头像

arctec

关注

还未添加个人签名 2019.08.21 加入

还未添加个人简介

评论

发布
暂无评论
题目一: 分析一条 TPCDS SQL