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如何将你的代码转换为在集群上物理执行的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值