先天性耳畸形

首页 » 常识 » 诊断 » Spark从入门到精通系列3Ap
TUhjnbcbe - 2021/6/28 1:08:00
白癜风复发 http://m.39.net/pf/a_4346590.html

来源

LearningSparkLightning-FastDataAnalytics,SecondEdition

作者

Damji,etal.

翻译

吴邪大数据4年从业经验,目前就职于广州一家互联网公司,负责大数据基础平台自研、离线计算实时计算研究

校对

gongyouliu

编辑

auroral-L

全文共字,预计阅读时间80分钟。

第三章ApacheSpark结构化API

1.Spark:什么是RDD?

2.结构化Spark

2.1主要的优点和优势

3.DataFrameAPI

3.1Spark的基本数据类型

3.2Spark的结构化和复杂的数据类型

3.3数据结构(schema)和DataFrame创建

3.4列和表达式

3.5行(Row)

3.6常见的DataFrame操作

3.7使用DataFrameReader和DataFrameWriter

3.8端到端的DataFrame示例

在本章中,我们将探讨ApacheSpark添加结构化背后的主要动机,包括这些动机是如何引导高级API(DataFrame和DataSet)的创建,以及它们在Spark2.x中不同组件之间的一致性介绍。我们还将研究支撑这些结构化高级API的SparkSQL引擎。

当SparkSQL首次在早期的Spark1.x中被引入,接着是DataFrame作为Spark1.3中SchemaRDD的继承者,我们第一次看到了Spark完整的结构。SparkSQL引入了高级表达式操作函数,模拟了类似SQL的语法,DataFrame为后续版本中的更多结构奠定了基础,为Spark计算查询中的性能操作铺平了道路。

但在我们讨论较新的结构化API之前,让我们先看一下简单的RDD编程API模型,以简要了解一下Spark中没有结构的感觉。

1.Spark:什么是RDD?

RDD是Spark最基本的抽象,与RDD相关的三个重要特性:

依赖关系:宽依赖和窄依赖数据分区(Partitions):数据集组成单位,带有位置信息计算函数:Partition=Iterator[T]

这三个特性都是RDD编程API模型最基本的组成部分,基于RDD模型构建所有更高级别的功能。首先,需要一个依赖关系列表,该依赖关系指示Spark如何使用其输入构造RDD。必要时,Spark可以根据这些依赖关系重新创建RDD并对其进行复制操作。这一特性使得RDD具有弹性。

其次,分区使得Spark能够对数据进行拆分,以便跨Executor的分区进行并行计算。在某些情况下,例如从HDFS读取,Spark将使用位置信息将工作发送给接近数据的Executor。这样,通过网络传输的数据就会更少,减少网络IO。

最后,RDD具有计算功能,它可以将存储在RDD中的数据生成一个Iterator[T]。

简单而优雅!然而,这个原始的模型存在几个问题。首先,计算函数(或计算)对Spark是不透明的。也就是说,Spark不知道你在计算函数中在做什么。无论是执行connect、filter、select还是aggregate,Spark都只将其视为lambda表达式。另一个问题是Iterator[T]数据类型对于PythonRDD来说也不透明;Spark只知道它是Python中的通用对象。

此外,由于无法检查函数中的计算或表达式,因此Spark无法优化该表达式——无法理解其中的意图。最后,Spark不了解T中的特定数据类型。Spark是一个不透明的对象,它不知道你是否访问对象中特定类型的列。因此,Spark所能做的就是将不透明对象序列化为一系列字节,而不使用任何数据压缩技术。

这种不透明性明显阻碍了Spark将计算重排为高效的查询计划的能力。那么解决方案是什么呢?

2.结构化Spark

Spark2.x引入了一些构建Spark的关键方案。一种是使用数据分析中常见的模式来表达计算。这些模式表示为高级操作,如过滤、选择、计数、聚合、平均和分组,这提供了更多的清晰度和简单性。

通过在DSL中使用一组通用运算符,可以进一步缩小了这种特异性。通过DSL中的一组操作(如Spark支持的lan参数(Java、Python、Spark、R、和SQL)中的操作),这些运算符可以让你告诉Spark你希望对数据进行什么计算,因此,它可以构建一个可执行的有效的查询计划。

最终的顺序和结构方案是允许你以表格的形式排列数据,如SQL表或电子表格,并使用受支持的结构化数据类型(稍后将介绍)。

但是,这种结构到底有什么好处呢?

2.1主要的优点和优势

结构带来许多好处,包括跨Spark组件提供性能和空间效率。在简要讨论DataFrame和DatasetAPI的使用时,我们将进一步探讨这些优势,但现在我们将集中讨论其他优势:表达性、简单性、可组合性和统一性。

让我们先用一个简单的代码片段来演示可表达性和可组合性。在下面的示例中,我们要汇总每个名称的所有年龄,按名称分组,然后计算年龄平均值——这是数据分析和发现中的一种常见模式。如果我们使用低级RDDAPI,代码如下:

#InPython#CreateanRDDoftuples(name,age)dataRDD=sc.parallelize([("Brooke",20),("Denny",31),("Jules",30),("TD",35),("Brooke",25)])#UsemapandreduceByKeytransformationswiththeirlambda#expressionstoaggregateandthen

1
查看完整版本: Spark从入门到精通系列3Ap