DataFrame与Spark SQL的由来

news/2024/5/20 11:09:36/文章来源:https://blog.csdn.net/Shyllin/article/details/128956707

文章目录

    • DataFrame与Spark SQL的由来
      • RDD 之殇:优化空间受限
      • DataFrame 横空出世
      • 幕后英雄:Spark SQL
        • 基于 DataFrame,Spark SQL 是如何进行优化的
        • Catalyst 优化器
        • Tungsten

DataFrame与Spark SQL的由来

Spark 已经有了 RDD 这个开发入口,为什么还要整出个 DataFrame 来呢?

RDD 之殇:优化空间受限

高阶函数,它指的是形参为函数的函数,或是返回类型为函数的函数。高阶函数,首先本质上也是函数,特殊的地方在于它的形参和返回类型。

RDD算子(如 map、filter等)都需要一个辅助函数 f 来作为形参,通过调用 map(f)、filter(f) 才能完成计算。Spark 只知道开发者要做 map、filter,但并不知道开发者打算怎么做 map 和 filter。

**在 RDD 的开发框架 下,Spark Core 只知道开发者要“做什么”,而不知道“怎么做”。**这让 Spark Core 两眼一抹黑,除了把函数 f 以闭包的形式打发到 Executors 以外,没有额外的优化空间。

DataFrame 横空出世

针对 RDD 优化空间受限的问题,Spark 社区在 1.3 版本发布了 DataFrame。相比 RDD,DataFrame 到底有何不同呢?我们不妨从两个方面来对比它们的不同:一个是数据 的表示形式(Data Representation),另一个是开发算子。

数据表示形式

DataFrame 与 RDD 一样,都是用来封装分布式数据集的。DataFrame 是携带数据模式(Data Schema)的结构化数据,而 RDD 是不携带Schema 的分布式数据集。恰恰是因为有了 Schema 提供明确的类型信息,Spark 才能有针对性地设计出更紧凑的数据结构,从而大幅度提升数据存储与访问效率。

开发算子

RDD 算子多采用高阶函数,高阶函数的优势在于表达能力强,它允许开发者灵活地设计并实现业务逻辑。而 DataFrame 的表达能力却很弱,它定义了一套 DSL 算子(Domain Specific Language),如select、filter、agg、 groupBy等等,它们都属于 DSL 算子。

尽管 DataFrame 算子在表达能力方面更弱,但是 DataFrame 每一个算子的计算逻辑都是确定的,比如 select 用于提取某些字段,groupBy 用于对数据做分组,等等。因此,Spark 可以基于启发式的规则或策略,甚至是动态的运行时信息,去优化 DataFrame 的计算过程。

总结下来,相比 RDD,DataFrame 通过携带明确类型信息的 Schema、以及计算逻辑明确的转换算子,为 Spark 引擎的内核优化打开了全新的空间。

幕后英雄:Spark SQL

首先,Spark Core 特指 Spark 底层执行引擎(Execution Engine)。而 Spark SQL 则凌驾于 Spark Core 之上,是一层独立的优化引擎(Optimization Engine)。Spark Core 负责执行,而 Spark SQL 负责优化,Spark SQL 优化过后的代码,依然要交付 Spark Core 来做执行。

在这里插入图片描述

基于 DataFrame,Spark SQL 是如何进行优化的

Spark SQL 的两个核心组件说起: Catalyst 优化器和 Tungsten

在这里插入图片描述

Catalyst 优化器

Catalyst 优化器,它的职责在于创建并优化执行计划,它包含 3 个功能模块:

  • 创建语法树并生成执行计划;

  • 逻辑阶段优化;

  • 物理阶段优化;

Catalyst 优化器是在逻辑优化阶段,基于启发式的规则和策略(如谓词下推、列裁剪), 调整、优化执行计划,为物理优化阶段提升性能奠定基础。

除了逻辑阶段的优化,Catalyst 在物理优化阶段还会进一步优化执行计划。与逻辑阶段主 要依赖先验的启发式经验不同,物理阶段的优化,主要依赖各式各样的统计信息,如数据表尺寸、是否启用数据缓存、Shuffle 中间文件,等等。逻辑优化更多的是一 种“经验主义”,而物理优化则是“用数据说话”。

Tungsten

Tungsten 用于衔接 Catalyst 执行计划与底层的 Spark Core 执行引擎,它主要负责数据结构优化与执行代码优化。

数据结构优化指的是 Unsafe Row 的设计与实现;执行代码优化则指的 是全阶段代码生成(WSCG,Whole Stage Code Generation)。

为什么要有 Unsafe Row

对于 DataFrame 中的每一条数据记录,Spark SQL 默认采用 org.apache.spark.sql.Row 对象来进行封装和存储,使用 Java Object 来存储数据会引入大量额外的存储开销。

为此,Tungsten 设计并实现了一种叫做 Unsafe Row 的二进制数据结构。Unsafe Row 本质上是字节数组,它以极其紧凑的格式来存储 DataFrame 的每一条数据记录,大幅削减存储开销,从而提升数据的存储与访问效率。

WSCG:全阶段代码生成

代码生成,指的是 同一个 Stage,Tungsten 在运行时把算子之间的“链式调用”捏合为一份代码。

完成 Catalyst 和 Tungsten 这两个优化环节之后,Spark SQL把优化过的执行计划、以及生成的执行代码,交付给Spark Core。Spark Core 拿到计划和代码,在运行时利用 Tungsten Unsafe Row 的数据结构, 完成分布式任务计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_255592.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSJ-21A AC220V静态【时间继电器】

系列型号: SSJ-11B静态时间继电器;SSJ-21B静态时间继电器 SSJ-21A静态时间继电器;SSJ-22A静态时间继电器 SSJ-22B静态时间继电器SSJ-42B静态时间继电器 SSJ-42A静态时间继电器SSJ-41A静态时间继电器 SSJ-41B静态时间继电器SSJ-32B静态时间继电…

MySQL架构图

MySQL架构图 Mysql逻辑架构图主要分三层: 1) 第一层负责连接处理,授权认证,安全等等 每个客户端连接都会在服务器进程中拥有一个线程,服务器维护了一个线程池,因此不需要为每一个新建的连接创建或者销毁线程。 当客户…

不用U盘 重装系统(别再浪费钱去电脑城装系统了)

不用U盘 重装系统(别再浪费钱去电脑城装系统了) 首先打开浏览器,搜索MSDN回车,选择第一个网站 点击操作系统 往下拉找到win10专业版 选择(business editions)和 (x64) 打开迅雷,点击新建&a…

Java --- Integer.parseInt()

parseInt() 方法是java.lang 包下Integer 类的一个方法。 Java Integer parseInt() 方法共有三种不同类型,可以根据其参数进行区分。 用法: 以下是 parseInt() 方法的声明: public static int parseInt (String s) public static int parseInt (Strin…

暗月内网渗透实战——项目七

首先环境配置 VMware的网络配置图 环境拓扑图 开始渗透 信息收集 使用kali扫描一下靶机的IP地址 靶机IP:192.168.0.114 攻击机IP:192.168.0.109 获取到了ip地址之后,我们扫描一下靶机开放的端口 靶机开放了21,80,999,3389,5985,6588端口…

ChatGpt,普通人如何做到年薪 50 万

国内使用ChatGpt的方式汇总,2023 年 2 月 8 号,亲测可用 最近,ChatGpt 很火,身边的人都在讨论,会不会成为下一个风口,想前几年互联网一样,迎来井喷式的发展。 小徐我也是在关注,这…

pycharm的terminal与Project interpreter 配置环境不一致的问题

考虑自己的项目名中是否出现了中文,我是因为这个原因导致Terminal 前面出现了PS,用第2条解决切换终端环境后还是安装包不一致。终端出现PS,考虑在settings中搜索找到Terminal,修改其Shell path为cmd.exe,关闭重新打开T…

PGL 系列(七)metapath2vec

metapath2vec 基于meta-path的random walks来构建每个顶点的异构邻域,然后用Skip-Gram模型来完成顶点的嵌入。

中国大学mooc 机器人操作系统讲义以及部分笔记

这里写目录标题二进制与源码包1.7 安装RoboWare Studio新的连接配套代码 官方看了一下课程官方的讲义连接,似乎很多页面已经丢失?或者是未授权?二进制与源码包 https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/chapter…

复习0206

目录 一、访问修饰符 一、权限范围 二、注意事项 二、封装(面向对象的三大特征之一) 一、封装的好处 二、封装的实现步骤 三、和构造器结合 四、练习题中的细节 一、访问修饰符 一、权限范围 访问修饰符用于控制方法和属性(成员变量…

MyBatis基础知识

1 JDBC基础知识1.1 JDBC简介JDBC是使用Java语言操作关系型数据库的一套API,全称Java DataBase Connectivity,Java数据库连接。JDBC定义了操作所有关系型数据库的规则,同一套Java代码可以操作不同的关系型数据库。也就是JDBC是Java语言操作数据…

2023年rabbitMq面试题汇总4(7道)

一、如何保证消息的顺序性?1. 通过某种算法,将需要保持先后顺序的消息放到同⼀个消息队列中(kafka中就是partition,rabbitMq中就是queue)。然后只⽤⼀个消费者去消费该队列。2. 可以在消息体内添加全局有序标识来实现。二、使⽤RabbitMQ增加rest服务吞吐…

一篇文章学懂C++和指针与链表

指针 目录 指针 C的指针学习 指针的基本概念 指针变量的定义和使用 指针的所占的内存空间 空指针和野指针 const修饰指针 指针和数组 指针和函数 指针、数组、函数 接下来让我们开始进入学习吧! C的指针学习 指针的基本概念 指针的作用:可…

【Python】Python学习笔记(二)基本输入输出

Python娘来源:https://next.rikunabi.com/tech/docs/ct_s03600.jsp?p002412 目录print()函数不进行自动换行的print()函数打印输出多个字符串只进行换行input()函数使用format方法格式化字符串字符串与数值转换字符串转换为数值数值转换为字符串总结参考资料print(…

【MongoDB】多级嵌套数组的操作 含Mongo Shell 和 MongoTemplate的增删改细节

文章目录1.前言2.数据准备3.Mongo Shell操作实践3.1.第一层数组操作3.1.1.新增元素3.1.2.修改元素3.1.2.1.批量修改元素中的坑3.1.3.使用$[<identifier>]做批量修改3.1.4.移除元素3.2.第二层数组操作3.2.1.新增与移除元素3.2.2.修改元素中的字段值3.2.2.1.易错点4.Mongo …

面试-java Spring 一

一.Spring两大特性 控制反转(IoC)&#xff1a;就是创建对象的控制权&#xff0c;被反转到了Spring框架上。通常我们实例化一个对象时&#xff0c;都是使用类的构造方法来new一个对象&#xff0c;这个过程是由我们自己来控制的&#xff0c;而控制反转就把new对象的工交给了Spri…

常用排序方式分析与比较

title: 常用排序方式分析与比较 date: 2020-04-05 15:59:00 tags: 排序直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序 categories:算法 下面选取在实际项目中应用较多的排序方式作一个性能比较&#xff0c;并会对各个方式作一个分析总结。 排序性能比较 …

int、uint类型的比较与加减

uint与int的比较 int与uint比较时会把int转换成uint&#xff0c;一个负的int转换成uint会溢出。所以uint与int比较大小时容易得到错误的结果&#xff0c;如&#xff1a; #include <iostream> using namespace std;int main(int, char**) {cout << "compare …

JavaEE15-Spring Boot统一功能处理

目录 1.统一用户登录权限效验 1.1.最初用户登录验证 1.2.Spring AOP用户统一登录验证的问题 1.3.Spring拦截器 1.3.1.创建自定义拦截器&#xff0c;实现 HandlerInterceptor 接口并重写 preHandle&#xff08;执行具体方法之前的预处理&#xff09;方法 1.3.2.将自定义拦…

【1797. 设计一个验证系统】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你需要设计一个包含验证码的验证系统。每一次验证中&#xff0c;用户会收到一个新的验证码&#xff0c;这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了&#xff0c;那么它…