SparkSQL的执行计划详解

一:首先将我们从文本中读取的数据映射到表也就是视图

eg:

  $>cat b.txt

  1 ded
  2 dsfre
  3 sfs
  4 fr

  $>val sc = spark.sparkContext     #创建SparkContext

  $>val rdd = sc.textFile("file:///home/Alex_lei/b.txt").map(x=>x.split(" ")).map(x=>(x(0),x(1)))

    #读取文件到rdd中(tuple形式,因为createDataFrame方法所需要的rdd为tuple形式)

  $>val df = spark.createDataFrame(rdd)    #创建dataframe

  $>df.createTempView("person")        #将dataframe映射到表

二:分析

$>val query = spark.sql("select * from person where _1>1") 

(1)explain() 查看物理计划

  $>query.explain()

    == Physical Plan ==

      *Filter (isnotnull(_1#3) && (cast(_1#3 as double) > 1.0))
        +- *SerializeFromObject [staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString,           assertnotnull(input[0, scala.Tuple2, true])._1, true) AS _1#3, staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple2, true])._2, true) AS _2#4]
          +- Scan ExternalRDDScan[obj#2]

    说明:类似一棵树,从下往上看,首先扫描外部RDD,然后是序列化字段,在就是过滤,判断是否为null和第一个字段大于1的。

(2)explain(true)查看整个SQL的执行计划,主要分为4个阶段

  --1:解析过程

    == Parsed Logical Plan ==

    ‘Project [*]
      +- ‘Filter (‘_1 > 1)
        +- ‘UnresolvedRelation `person`

    说明:Project[*]是我们所要的结果集,解析过程不能判断表person是否存在,有什么关系,然后就是列出过滤条件和所要的结果集。

  --2:逻辑阶段

    == Analyzed Logical Plan ==

    _1: string, _2: string
      Project [_1#3, _2#4]
        +- Filter (cast(_1#3 as double) > cast(1 as double))
          +- SubqueryAlias person
            +- SerializeFromObject [staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple2, true])._1, true) AS _1#3, staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple2, true])._2, true) AS _2#4]
              +- ExternalRDD [obj#2]

    说明:首先还是加载外部RDD,然后序列化字段,列出映射表的名字,确认表存在,然后按照条件过滤,获取结果集。

  --3:优化阶段

    == Optimized Logical Plan ==

     Filter (isnotnull(_1#3) && (cast(_1#3 as double) > 1.0))
      +- SerializeFromObject [staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple2, true])._1, true) AS _1#3, staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple2, true])._2, true) AS _2#4]
        +- ExternalRDD [obj#2]

    说明:和之前的一样,优化的部分就是过滤条件,先判断是否为null,这个和RDD的不同之处是rdd是将数据全部加在进来,而sparksql如果遇到有null值的直接停止,这个是个简单的优化方案,具体其他的优化措施还是根据所写的sql语句。

  --4:物理执行计划

    == Physical Plan ==

    *Filter (isnotnull(_1#3) && (cast(_1#3 as double) > 1.0))
      +- *SerializeFromObject [staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple2, true])._1, true) AS _1#3, staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, assertnotnull(input[0, scala.Tuple2, true])._2, true) AS _2#4]
        
+- Scan ExternalRDDScan[obj#2]

    说明:同上所说的物理执行计划。

    

原文地址:https://www.cnblogs.com/lyr999736/p/10204619.html

时间: 2024-11-09 01:54:05

SparkSQL的执行计划详解的相关文章

Oracle执行计划详解

 简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容. 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 Rowid的概念 Recursive Sql概念 Predicate(谓词) DRiving Table(驱动表) Probed Table(被探查表) 组合索引(concatenated index) 可选择性(selectivity) 二.oracle访问数据的存取方法 1) 全表扫描(Full Table Scan

mysql explain执行计划详解

1).id列SELECT识别符.这是SELECT查询序列号.这个不重要,查询序号即为sql语句执行的顺序 2).select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个 C:union:union连接的两个select查询,第一个查询是de

MySQL 优化sql explain执行计划详解

mysql explain执行计划详解 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有:A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个C:

MSSQLSERVER执行计划详解

序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博文给你:SqlServer性能检测和优化工具使用详细 ,sql语句的优化分析,T-sql语句查询执行顺序. 执行计划简介 1.什么是执行计划? 大哥提交的sql语句,数据库查询优化器,经过分析生成多个数据库可以识别的高效执行查询方式.然后优化器会在众多执行计划中找出一个资源使用最少,而不是最快的执行

explain 执行计划详解

id:id是一组数字,表示查询中执行select子句或操作表的顺序,如果id相同,则执行顺序从上至下,如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行. id列为null的就表是这是一个结果集,不需要使用它来进行查询. select_type: simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个. primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_

(转)MSSQLSERVER执行计划详解

原文地址:http://www.cnblogs.com/knowledgesea/p/5005163.html 序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博文给你:SqlServer性能检测和优化工具使用详细 ,sql语句的优化分析,T-sql语句查询执行顺序. 执行计划简介 1.什么是执行计划? 大哥提交的sql语句,数据库查询优化器,经过

MYSQL EXPLAIN 执行计划详解

explain的作用: explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. EXPLAIN SELECT ( SELECT c. NAME FROM fx_channel c WHERE c.id = s.channel_id ) , SUM(s.total_cost) , SUM(s.total_count) , SUM(s.success_count) FROM fx_analysis_channel_source s

mysql的sql执行计划详解

实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写sql语句的时候就很少考虑到性能的问题.但是当数据规模增大,如千万.亿的时候,我们运 行同样的sql语句时却发现迟迟没有结果,这个时候才知道数据规模已经限制了我们查询的速度.所以,查询优化和索引也就显得很重要了. 问题: 当我们在查询前能否预先估计查询究竟要涉及多少行.使用哪些索引.运行时间呢?答案

linux下任务计划详解

一次性任务计划 用at(指定时间执行任务,需开启atd服务)   batch(不指定执行时间,在系统空闲时/系统负载较低时自动执行任务)等命令来实现 周期性任务计划 cron(需启动crond服务) at介绍 at now+3min|11:30|noon,midnight,teatime(更多时间指定格式见man at页)  回车  在>提示符下可输入多行命令,用ctrl+d提交任务 atq 查看当前等待执行的atd的命令队列,或  at  -l at会将执行结果(即执行输出)以邮件方式发给任务