结构化API概述

本书的这一部分将深入探讨Spark的结构化API。结构化API是处理各种数据类型的工具,可处理非结构化的日志文件、半结构化的CSV文件,以及高度结构化的Parquet文件。结构化API指以下三种核心分布式集合类型的API:

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

Spark支持两种结构化集合类型:

DataFrame和Dataset

Schema

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

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

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

结构化API执行概述

针对一个结构化API查询任务,我们逐步分析从用户代码到执行代码的过程。步骤如下:

  • 编写DataFrame / Dataset / SQL代码
  • 如果代码能有效执行,Spark将其转换为一个逻辑执行计划(Logical Plan)
  • Spark将此逻辑执行计划转化为一个物理执行计划,检查可行的优化策略,并在此过程中检查优化
  • Spark在集群上执行该物理执行计划(RDD操作)

我们的代码通过控制台提交给Spark,或者以一个Spark作业的形式提交。然后代码将交由Catalyst优化器决定如何执行,并制定一个执行计划。最后代码被运行,得到的结果返回给用户。

逻辑计划

执行的第一阶段旨在获取用户代码并将其转换为逻辑计划

物理计划

在成功创建优化的逻辑计划后,Spark开始执行物理计划流程。物理计划(通常称为Spark计划)通过生成不同的物理执行策略,并通过代价模型进行比较分析,从而指定如何在集群上执行逻辑计划

执行

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