• Spark - 第4章 结构化API概述



            结构化API是处理各种数据类型的工具,可处理非结构化的日志文件、半结构化的CSV文件,以及高度结构化的Parquet文件。结构化API指以下三种核心分布式集合类型的API:

    • Dataset类型
    • DataFrame类型
    • SQL表和视图

            大多数结构化API均适用于批处理和流处理,这意味着使用结构化API编写代码时,几乎不费吹灰之力就可以从批处理程序转换为流处理程序(反之亦然)
            结构化API是在编写大部分数据处理程序时会用到的基础抽象。 需要理解一些基本概念:类型化和非类型化的API,以及它们的差异;核心术语;Spark如何将结构化API数据流实际应用到集群上并执行它。
            转换操作和动作操作操纵的逻辑结构是DataFrame和Dataset,创建一个新的DataFrame或Dataset需要调用一个转换操作。如果要启动计算,或者要将DataFrame或Dataset转换为本地语言的类型,则需要调用一个动作。

    DataFrame类型和Dataset类型

            Spark支持两种结构化集合类型:DataFrame和Dataset。
            DataFrame和Dataset是具有行和列的类似于(分布式)数据表的集合类型。所有列的行数相同(可以使用null来指定缺省值),每一列的所有行都必须保持一致的数据类型。Spark中的DataFrame和Dataset代表不可变的数据集合,可以通过它指定对特定位置数据的操作,该操作将以惰性评估方式执行。

    Schema

            Schema数据模式定义了分布式集合中存储的数据类型。
            Schema定义了DataFrame的列名和类型,可以手动定义或者从数据源读取模式(通常定义为模式读取)。Schema数据模式需要指定数据类型,这意味着你需要指定在什么地方放置什么类型的数据。

    结构化Spark类型概述

            Spark实际上有它自己的编程语言,Spark内部使用一个名为Catalyst的引擎,在计划制定和执行作业的过程中使用Catalyst来维护它自己的类型信息,这样就会带来很大的优化空间,这些优化可以显著提高性能。

    DataFrame与Dataset的比较

            实质上,结构化API包含两类API,即非类型化的DataFrame和类型化的Dataset。其实它们都是有类型的,只是Spark完全负责维护DataFrame的类型,运行时检查这些类型是否与schema中指定的一致。而Dataset在编译时就会检查类型是否符合规范。
            Dataset仅适用于基于Java虚拟机(JVM)的语言(比如Java和Scala),并通过case类胡总Java Beans指定类型。Python版本和R语言版本的Spark并不支持Dataset,所有东西都是DataFrame。
            在Scala版本的Spark中,DataFrame就是一些Row类型的Dataset的集合。“Row”类型是Spark用于支持内存计算而优化的数据格式。这种计算有利于高效计算,因为它避免使用会带来昂贵垃圾回收开销和对象实例化开销的JVM类型,而是基于自己的内部格式运行,所以并不会产生这种开销。

            一行对应一个数据记录。就像对DataFrame调用collect方法时所看到的,DataFrame中的每条记录都必须是Row类型。我们可以通过SQL手动创建、或者从弹性分布式数据集(RDD)提取,或从数据源手动创建这些行。

            列表示一个简单类型(例如,整数或字符串),或者一个复杂类型(例如,数组或map映射),或者空值null。Spark记录所有这些类型的信息并提供多种转换方法。

    Spark类型

            Spark有大量的内部类型表示。表示在你使用的语言中的某数据类型和与之对应的Spark类型。
            当然,所有这些类型都很有用,但是你几乎不会用到纯静态的DataFrame对象,你将会一直操作和转换他们。

    结构化API执行概述

    • 编写DataFrame/Dataset/SQL代码
    • 如果代码能有效执行,Spark将其转换为一个逻辑执行计划(Logical Plan)
    • Spark将此逻辑执行计划转化为一个物理执行计划(Physical Plan),检查可行的优化策略,并在此过程中检查优化
    • Spark在集群上执行该物理执行计划(RDD操作)
              我们编写的代码通过控制台提交给Spark,或者以一个Spark作业的形式提交。然后代码将交由Catalyst优化器决定如何执行,并制定一个执行计划。最后代码被运行,得到的结果返回给用户。

    逻辑执行

            执行的第一阶段旨在获取用户代码并将其转换为逻辑计划。
            这个逻辑计划仅代表一组抽象转换,并不涉及执行器或驱动器,它只是将用户的表达式集合转换为最优的版本。它通过将用户代码转换为未解析的逻辑计划来实现这一点。这个计划没有解析,因为虽然你的代码可能是有效的,但它引用的表可能不存在。Spark使用catalog(所有表和DataFrame信息的存储库)在分词器中解析列和表格。如果目录中不存在所需1的表或列名称,分析器可能会拒绝该为解析的逻辑计划。如果分词器可以解析它,结果将通过Catalyst优化器,Catalyst优化器尝试通过下推谓词或选择操作来优化逻辑计划。用户也可以扩展Catalyst优化器来支持自己的特定领域优化策略。

    物理计划

            在成功创建优化的逻辑计划之后,Spark开始执行物理计划流程。物理计划(通常称为Spark计划)通过生成不同的物理执行策略,并通过代价模型进行比较分析,从而指定如何在集群上执行逻辑计划。
            物理执行计划产生一系列的RDD和转换操作。这就是Spark被称为编译器的原因,因为它将对DataFrame、Dataset和SQL中的查询操作为你编译一系列RDD的转换操作。

    执行

            在选择一个物理计划时,Spark将所有代码运行在Spark的底层编程接口RDD上。Spark在运行时执行进一步优化,生成可以在执行期间优化任务或阶段的本地Java字节码,最终将结果返回给用户。

    小结

            在本章中,我们介绍了Spark结构化API以及Spark如何将你的代码转换为在集群上物理执行的代码。

  • 相关阅读:
    scope=spfile/memory/both的区别
    算法题记录模板
    看过来——用Python探索《红楼梦》的人物关系
    Github每日精选(第13期):实时目标检测网络YOLOv7
    计算机专业哀鸿遍野:低代码平台和程序员水火不容,马上被取代
    抖音上的影视解说是怎么配音的?
    Python015--python常用库之turtle库(简单的入门)
    使用 Visual Studio Code (VS Code) 作为 Visual C++ 6.0 (VC6) 的编辑器
    【51单片机】利用【时间延迟】的原理规避【按键抖动问题】
    UDDI初了解
  • 原文地址:https://blog.csdn.net/weixin_44556968/article/details/124766396