百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

Spark Sql spark sql中一般是读取数据后转换为rdd

liebian365 2024-10-28 17:16 26 浏览 0 评论

Analysis

SQL或者DataFrame API中解析得到抽象语法树,依据catalog元数据校验语法树(表名、列名,或列类型),将Unresolved Logical Plan解析成Resolved Logical Plan

多个性质类似的Rule组成一个Batch,多个Batch构成一个Batchs,这些batches会由RuleExecutor执行,先按一个一个Batch顺序执行,然后对Batch里面的每个Rule顺序执行。每个Batch会执行一次会多次。

Logical Optimizations

基于规则优化,其中包含谓词下推、列裁剪、常亮折叠等。利用Rule(规则)将Resolved Logical Plan解析成Optimized Logical Plan,同样是由RuleExecutor执行

Physical Planning

前面的Logical Plan不能被Spark执行,这个过程是把Logical Plan转换成多个Physical Plan(物理计划),然后利用Cost Mode(代价模型)选择最佳的执行计划;

和前面的逻辑计划绑定和优化不一样,这里使用Strategy(策略),而前面介绍的逻辑计划绑定和优化经过transform动作之后,树的类型没有改变,也就是说:Expression 经过 transformations 之后得到的还是 Expression ;Logical Plan 经过 Transformations 之后得到的还是Logical Plan。而到了这个阶段,经过 Transformations 动作之后,树的类型改变了,由Logical Plan转换成Physical Plan了。 一个Logical Plan(逻辑计划)经过一系列的策略处理之后,得到多个物理计划,物理计划在Spark是由SparkPlan实现的。多个Physical Plan再经过Cost Model(代价模型,CBO)得到选择后的物理计划(Selected Physical Plan)

CBO

估算所有可能的物理计划的代价,并挑选出代价最小的物理执行计划。

Cost = rows * weight + size * (1 - weight)

  • rows:记录行数代表了 CPU 代价
  • size:代表了 IO 代价
  • spark.sql.cbo.joinReorder.card.weight

LogicalPlan统计信息

LogicalPlanStats以trait的方式在每个LogicalPlan中实现

/** * A trait to add statistics propagation to [[LogicalPlan]]. */
trait LogicalPlanStats { self: LogicalPlan =>
  def stats: Statistics = statsCache.getOrElse {
    // 开启cbo 统计,只实现了Aggregate、Filter、Join、Project
    // 其余逻辑还是复用SizeInBytesOnlyStatsPlanVisitor
    // 主要统计 rowCount,size,ColumnStat(列统计信息)
    if (conf.cboEnabled) {
      // 除了统计节点的字节数
      statsCache = Option(BasicStatsPlanVisitor.visit(self))
    } else {
      // 仅仅统计节点的大小(以字节为单位)
      statsCache = Option(SizeInBytesOnlyStatsPlanVisitor.visit(self))
    }
    statsCache.get
  }
  /** A cache for the estimated statistics, such that it will only be computed once. */
  protected var statsCache: Option[Statistics] = None
}

如果开启CBO,在Optimize阶段,会通过收集的表信息对InnerJoin sql进行优化,如下图:

Code Generation

前面生成的Physical Plan还不能直接交给Spark执行,Spark最后仍然会用一些Rule对SparkPlan进行处理,如下:

QueryExecution

/** A sequence of rules that will be applied in order to the physical plan before execution. */
  protected def preparations: Seq[Rule[SparkPlan]] = Seq(
    PlanSubqueries(sparkSession),                           // 特殊子查询物理计划处理
    EnsureRequirements(sparkSession.sessionState.conf),     // 确保执行计划分区与排序的正确性
    CollapseCodegenStages(sparkSession.sessionState.conf),  // 代码生成
    ReuseExchange(sparkSession.sessionState.conf),          // 节点重用
    ReuseSubquery(sparkSession.sessionState.conf))          // 子查询重用

Join Cardinality(基数)

Inner Join : num(A IJ B) = num(A)*num(B)/max(distinct(A.k),distinct(B.k))

Left-Outer Join : num(A LOJ B) = max(num(A IJ B),num(A))

Right-Outer Join : num(A ROJ B) = max(num(A IJ B),num(B))

Full-Outer Join : num(A FOJ B) = num(A LOJ B) + num(A ROJ B) - num(A IJ B)

cost = weight * cardinality + (1.0 - weight) * size

相关推荐

C#委托—马工教你轻松玩转委托(c#中委托)

前言大家好,我是马工!在C#中有一个小白谈之色变的知识点叫委托,很多学了一两年C#的还不知道委托究竟是什么东西,本文就来帮你彻底解开解惑,从此委托就是小儿科!...

AR农业种植指导(农业种植模式)

以下是一些常见的AR/VR在农业中的应用场景及相关源码示例的一些思路(注意,完整且复杂的源码通常需要根据具体需求和大量开发工作来完成,这里只是简单示例):1.AR农业种植指导-功能描述:通过AR...

C#中timer中的enable和start以及stop的作用分别是什么?

文章来自AI问答的摘录。在C#中,System.Timers.Timer和System.Windows.Forms.Timer都提供了Enabled属性以及Start()和Stop()方法来控制定时器...

AOP实现原理浅析(简述aop的原理以及作用)

在C#中实现一个简单的动态代理框架,可以通过反射和System.Reflection.Emit命名空间动态生成代理类。以下是一个分步指南和示例代码:...

如何防止数据库服务器的 SQL 注入攻击

如何防止数据库服务器的SQL注入攻击防止SQL注入攻击需要从代码开发、数据库配置到安全运维的全流程防护。以下是详细且可操作的防护策略和步骤:...

.NET依赖注入实战:基于Autofac的完全指南与代码示例

...

AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类

...

C# winform中chart控件解决显示大量曲线数据卡顿

前言:...

Java静态三剑客(静态内部类/静态方法/静态类)的正确打开方式

作为Java程序员必知的"静态三剑客",它们看似简单却暗藏玄机!本文将带你解锁高阶玩法,避免99%开发者都会踩的坑!一、概念速览(颠覆传统认知)...

生成AutoCAD图纸批量合并代码(autocad怎么合并图纸)

想要生成AutoCAD图纸批量合并的代码。首先,我需要确定他使用哪个版本的AutoCAD,因为不同版本的API可能不同,比如VBA、.NET(C#或VB.NET)或者AutoLISP。不过用户没有具体...

C#从入门到精通(4)—Linq实现集合快速转换、筛选、排序、分组

前言大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在C#开发中需要经常对集合中的数据进行处理,比如我需要将一个Int类型的集合数...

CSnakes:在.NET项目中嵌入Python代码的工具

...

CSharp(dotNet)绝版面试题,面试大全(二)

21.简述C#的密封类和密封方法?C#中,密封类和密封方法都是使用sealed修饰。密封类表示这个类不能被继承。密封方法表示这个方法不能被重写,和virtual方法相对。22.请介绍C#静态构造器的特...

C#从入门到精通(7)—C#裁剪图像的几种方法总结

前言大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在上位机软件开发过程中经常需要裁剪图像,本文就是对c#中常见的裁剪图像方法进行...

Csharp 进度条的使用(c#进度条是哪个控件)

【开发过程】(1)创建一个Windows应用程序,项目名称为Ex047,窗体默认为Form"(2)在窗体中添加菜单、工具栏和状态栏。(3)面添加ProgressBar.设置。(4)在窗体载入Loa...

取消回复欢迎 发表评论: