IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Spark SQL实现原理-逻辑计划的优化-操作下推:PushProjectionThroughUnion -> 正文阅读

[大数据]Spark SQL实现原理-逻辑计划的优化-操作下推:PushProjectionThroughUnion

PushProjectionThroughUnion操作下推优化规则的作用是:把在Union操作一边的Projections(投影)操作推到Union的两边。要注意这样优化的前提是在Spark SQL中nion操作不会对数据去重。这里的Projections可以理解为select字段的操作。也就是说,把select操作推到Union操作的两边。

优化规则的使用

先通过例子来查看和理解一下该优化规则的效果。使用local模式启动spark的scala终端,打开TRACE日志(可以在scala终端中通过sc.setLogLevel(“TRACE”)来开启跟踪日志)。在终端中输入以下代码:

import spark.implicits._
case class Person(name: String, age: Long)

val data2 = Seq(Person("Michael", 29), Person("Andy", 30), Person("Justin", 11))
val ds2 = spark.createDataset(data2)
val data3 = Seq(Person("Michael", 9), Person("Andy", 7), Person("Justin", 11))
val ds3 = spark.createDataset(data3)

// 进行数据集的union和select运算
ds2.union(ds3).union(ds2).select("name").explain(true)

查看输出的日志,可以看到以下输出:

=== Applying Rule org.apache.spark.sql.catalyst.optimizer.PushProjectionThroughUnion ===
!Project [name#119]                         Union
!+- Union                                   :- Project [name#119]
!   :- LocalRelation [name#119, age#120L]   :  +- LocalRelation [name#119, age#120L]
!   :- LocalRelation [name#124, age#125L]   :- Project [name#124]
!   +- LocalRelation [name#119, age#120L]   :  +- LocalRelation [name#124, age#125L]
!                                           +- Project [name#119]
!                                              +- LocalRelation [name#119, age#120L]

我们做了两次union操作和一次select操作。从以上日志输出可以看到,初始的逻辑计划中Project操作只是在Union的一边,通过优化器的PushProjectionThroughUnion规则优化后,Project操作被放到了Union的两边。

那么,为什么要这样去优化呢?在查询数据时,要让查询的性能提升,就要尽量少扫描数据块,通过union下推的优化,可以让本来只有union一边的Project或Filter操作放到了Union的两边,这样做其实是把本来只过滤一个Dataset的操作,优化成了同时过滤两个Dataset,从而对两边的数据进行了过滤,让计算的数据量变得更少了,从而提升了union操作的性能。

另外,由于Union操作不会对数据进行去重,所以这种优化不会对数据产生丢失。Union distinct操作却不能这样优化。

规则的实现

Union的Project下推操作的详细实现可以在PushProjectionThroughUnion类中查看。主要逻辑的其实现代码在apply函数中,该函数的实现逻辑如下:

(1)检查逻辑计划的节点,若父节点是Project,子节点是Union操作时(也就是先进行union操作,再进行select操作时,该优化规则只处理这种逻辑计划),跳到(2),否则什么都不做。

(2)从判断条件可知,头节点是一个Project节点,我们需要把Project推到Union操作的两端,就必须要Union作为父节点,所以要重新创建头节点(Project节点);

(3)然后为其他子节点创建Project父节点;

(4)最后把这颗子树,作为Union的子树,让Union作为父节点。

其实现代码如下:

// 后续遍历逻辑计划树,查找父节点是Project,而子节点是Union操作的
def apply(plan: LogicalPlan): LogicalPlan = plan transform {

  // 查找父节点是Project,而子节点是Union操作的节点
  case p @ Project(projectList, Union(children)) =>
    assert(children.nonEmpty)
    if (projectList.forall(_.deterministic)) {  // 遍历所有的字段名
      // 从新创建Union的子节点,头节点是一个Project节点
      val newFirstChild = Project(projectList, children.head)
      // 构建其他Project节点和其子节点
      val newOtherChildren = children.tail.map { child =>
        val rewrites = buildRewrites(children.head, child)
        Project(projectList.map(pushToRight(_, rewrites)), child)
      }
      // 以Union为父节点,把两边的Project节点都作为子节点
      Union(newFirstChild +: newOtherChildren)
    } else {
      p
    }
}

注意:以上只是简单的介绍了函数的实现逻辑,要了解详细的实现,可以直接查看实现源码。

小结

本文介绍了逻辑计划优化规则的操作下推类优化规则中的一个:PushProjectionThroughUnion的使用和实现原理。该优化规则主要优化union和select组合使用的情况。为了提升计算性能,Spark SQL会把select操作推到Union操作的两端,这样可以减少进行union操作时的数据量。

针对union或join等操作后续还有很多优化规则,都是基于这样的考虑。

这也提醒我们,在进行数据处理时,随时提醒自己 :过滤!过滤!过滤!先去掉不需要的行和列。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:42:24  更:2021-07-11 16:43:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 7:40:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码