SparkSql的Catalyst之图解简易版

一,基本介绍

一言不合就上图。

由上图可以看出Catalyst的作用尤为重要。MLPipelines Structured Streaming,GraphFrames都是基于DataFrame和DataSet,进而可使用Catalyst进行优化,Sparksql 直接可以使用Catalyst进行优化。我们也可以根据数据源的特点,自己实现自己的数据源输入和相关的谓词下推优化。

那么为啥大家都喜欢结构化的数据呢?

1,根据定义,结构将限制可以表达的内容。

2,在实践中,我们可以容纳绝大多数的计算。

3,限制可以表达的空间实现优化。

从表达上来看

从处理速度上来看

二,Catalyst如何工作

使用高级编程接口编写程序

-程序用于描述需要什么数据操作,而无需指定如何执行这些操作。

-获得一个优化器,自动找出执行用户程序中指定的数据操作的最有效的方案。

如下图:

组件介绍

1),Analysis(Rule Executor):

将一个Unresolved logical plan转化为一个Resolved logical plan。

Unresolved => Resolved :使用Caatalog 找到datasets或者columns的来源和columns的类型。

2),Logical Optimization(Rule Executor):

将一个Resolved Logical plan 转化为一个 Optimized Logical Plan。

3),Physical Planning(Strategies + Rule Executor):

将一个Optimized Logical Plan 转化为一个Pysical Plan。

举例说明

比如,select sum(v) from ( select t1.id,1+2+t1.value as v) from t1 join t2 where t1.id = t2.id and t2.id > 50 * 1000) tmp

1),表达式(expression):

表达式代表一个新的值,需要根据输入计算才能得到。如:1+2+t1.value

2),属性(Attribute):

一个dataset的列(t1.id)或者或者一个特殊操作产生的一个列(v)。

根据sql构建的树如下:

逻辑计划:

1),逻辑计划描述了数据集上的计算,而不定义如何进行计算。

2),Output:

输出一个属性列表,如:[id,v]

3),约束:

关于由该计划生成的行的一组不变量,如:t2.id > 50 * 1000

物理计划:

1),物理计划描述了关于如何进行计算的具体定义的数据集的计算。

,物理计划是可执行的

转换操作

1,不转换tree类型的转换(Transform 和 Rule Executor)

1),Expressing => Expression

2),Logical Plan => Logical Plan

3),Physical Plan => Physical Plan

2,从一种类型的树,转换为另一种类型的树

Logical Plan => Physical Plan

3,与用于实现单个规则的每个树相关联的函数。

4,每个转换都是一个部分函数(Partial Function)

5,部分函数(Partial Function):

部分函数指的是定义的是输入的子集。Case 语句决定了是否给定的输入定义了部分函数。

组合新的规则:

1),谓词下推

对于很多过滤条件呢,假如数据源支持,那么就可以直接将过滤下推到数据加载的过程中,减少加载到Spark的数据,进而实现优化。

2),常量聚合

常量的计算没必要每行都计算一次,再生成规则的时候就可以直接结算然后使用计算过的结果。

3),列裁剪

只从数据源加载我们需要的列,对于不相关的列不加载。

RuleExecutor

Catalyst会将规则分组,在达到稳定点之前会一直执行当前组的规则,fixed point的意思也就是在使用当前组的规则树不会再变化了。将规则运行到fixed point意味着每个规则可以简单的,但仍然最终对树有更大的全局影响。RuleExecutor可以将一棵树转化为另一棵树,通过使用在同个批次的rules。

从物理计划到逻辑计划

1),通过使用一些列的策略可以使逻辑计划转化为物理计划。

2),每个策略都是使用模式匹配将一个数转化为另一种数。

SparkPlanner

1),首先是使用策略将逻辑计划转化为物理计划

2),使用RuleExecutor将物理计划变为可执行

A),准备标量子查询。

B),确保输入行的要求。

两个字段都需要进行排序,假如其中一个列已经排序好了,那可以省略排序的步骤。如下图

C),使用物理优化器。

三,总结

本文主要是用图文结合的方式举例子说明了一个Catalyst优化一个Sql的过程。

本文主要是截取自YouTube视频:https://www.youtube.com/watch?v=GDeePbbCz2g&t=1563s

由于SparkSql ,ML pipeline,StructuredStreaming ,GraphFrame都是要直接或者间接的使用到Catalyst,所以深入了解Catalyst对我们利用数据源特征,设计好应用程序会有很大帮助。后面会从源码层面去解析,SparkSQL解Catalyst。

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2017-08-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

麻将游戏数据结构和AI算法

用休息时间零零散散写完了网络麻将游戏,感觉其中有不少值得记录的东西。 基础数据结构     数据结构确定决定了程序的开发难易程度,就像是游戏的骨架,对于电脑AI...

1.1K20
来自专栏微信公众号:Java团长

写出优质Java代码的4个技巧

如果现在要求对你写的Java代码进行优化,那你会怎么做呢?作者在本文介绍了可以提高系统性能以及代码可读性的四种方法,如果你对此感兴趣,就让我们一起来看看吧。

8010
来自专栏阮一峰的网络日志

贝叶斯推断及其互联网应用(三):拼写检查

(这个系列的第一部分介绍了贝叶斯定理,第二部分介绍了如何过滤垃圾邮件,今天是第三部分。) 使用Google的时候,如果你拼错一个单词,它会提醒你正确的拼法。 比...

433120
来自专栏杨建荣的学习笔记

任务调度并行算法的Python简单实现

本来自己想先使用Java来写一个版本,然后根据语法转义写成Python版本的,结果发现实际去做的时候有很多不同之处,首先就是Python中没有直接的数组的结构,...

53360
来自专栏鸿的学习笔记

写给开发者的机器学习指南(八)

Ranking emails based on their content(Recommendation system)

9620
来自专栏蜉蝣禅修之道

CMU算法求网络瓶颈链路

19160
来自专栏SAP最佳业务实践

想学FM系列(20)-SAP FM模块:派生规则推导策略(3)-派生规则推导步骤-派生规则、增强

4.1.4 派生规则 派生规则简单来讲由通过枚举条件的值来推导出目标字段的值。比如已知一个变量作为条件,枚举变量值为:V1、V2……,再枚举出目标变量对等值为:...

1.3K70
来自专栏数据分析

[数据分析工具] Pandas 功能介绍(二)

我们需要看第一季度的数据是怎样的,就需要使用条件过滤

25370
来自专栏Java编程

写出优质Java代码的4个技巧

如果现在要求对你写的Java代码进行优化,那你会怎么做呢?作者在本文介绍了可以提高系统性能以及代码可读性的四种方法,如果你对此感兴趣,就让我们一起来看看吧。

1.2K00
来自专栏PPV课数据科学社区

【学习】《R实战》读书笔记(第二章)

“读书会是一种在于拓展视野、宏观思维、知识交流、提升生活的活动。PPV课R语言读书会以“学习、分享、进步”为宗旨,通过成员协作完成R语言专业书籍的精读和分享,达...

36890

扫码关注云+社区

领取腾讯云代金券