本章介绍了Spark用于数据处理的核心抽象概念,具有弹性的分布式数据集(RDD).一个RDD仅仅是一个分布式的元素集合.在Spark中,所有工作都表示为创建新的RDDs.转换现有的RDD,或者调用RDD上的操作来计算结果.在底层,Spark自动将数据中包含的数据分发到你的集群中,并将你对它们执行的操作进行并行化.数据科学家和工程师都应该阅读这一章,因为RDD是Spark的核心概念.我们强烈建议你在这些例子中尝试一些 交互式shell(参见"Spark的Python和Scala shell的…
Common Transformations and Actions   本章中,我们浏览了Spark中大多数常见的transformation(转换)和action(开工).在包含特定数据类型的RDD上可以进行额外的操作,例如,可以对纯数字RDD使用统计函数,对键值对的RDD进行聚合操作.后面的章节我们会介绍这些特别的操作和RDD类型间的转换. Basic RDD (基础RDD)   首先,在忽略数据的影响的前提下,我们将描述所有的RDD上可以执行的transformation和action.…
Working on a Per-Partition Basis(基于分区的操作) 以每个分区为基础处理数据使我们可以避免为每个数据项重做配置工作.如打开数据库连接或者创建随机数生成器这样的操作,我们希望避免为每个元素重做配置工作.Spark有分区版本的map和foreach,通过让RDD的每个分区只运行一次代码,可帮助降低这些操作的成本. 回到我们的呼号例子中,有一个无线电台呼号的在线数据库,我们可以查询联系日志的公共列表.通过使用基于分区的操作,我们可以分享数据库的连接池来避免为多个连接配置…
Actions Available on Pair RDDs (键值对RDD可用的action)   和transformation(转换)一样,键值对RDD也可以使用基础RDD上的action(开工),并且键值对RDD有一些利用键值对数据特性的的action,如下表: 表4-3 键值对RDD上的action 函数名 描述 例子 结果 countByKey() 计算每个键元素的总数 rdd.countByKey() {(1,1),(3,2)} collectAsMap() 结果收集成一个map便…
  本章介绍了如何使用键值对RDD,Spark中很多操作都基于此数据类型.键值对RDD通常在聚合操作中使用,而且我们经常做一些初始的ETL(extract(提取),transform(转换)和load(加载))来把数据转化成键值对格式.键值对中有很多新操作(如,计算每个产品的评价,对相同键的数据进行分组,将两个不同的RDD组合在一起).   我们还将讨论一种高级特性,可以让用户控制节点间的RDD的布局:partitioning(分区).通过使用可控的分区,应用程序可以确保访问单个节点上的数据从而…
Introduction(介绍) 本章介绍了之前章节没有涵盖的高级Spark编程特性.我们介绍两种类型的共享变量:用来聚合信息的累加器和能有效分配较大值的广播变量.基于对RDD现有的transformation(转换),我们针对构建成本高的任务引入批量操作,如查询数据库.为了扩展我们可使用工具的范围,我们介绍Spark与外部程序交互的方法,例如用R编写的脚本. 在本章中,我们将以无线电台的通话记录作为输入构造一个示例.这些日志至少包括联系电台的呼号.呼号由国家分配,并且每个国家有自己的呼号范围,…
SequenceFiles(序列文件)   SequenceFile是Hadoop的一种由键值对小文件组成的流行的格式.SequenceFIle有同步标记,Spark可以寻找标记点,然后与记录边界重新同步.Spark还可以从多个节点并行高效地读取SequenceFile.SequenceFile也是Hadoop MapReduce中job的常用输入输出格式,如果你正使用着Hadoop系统,数据很有可能就是SequenceFile格式的.   SequenceFile是由实现HadoopWrita…
  开发工程师和数据科学家都会受益于本章的部分内容.工程师可能希望探索更多的输出格式,看看有没有一些适合他们下游用户的格式.数据科学家可能会更关注他们已经使用的数据格式. Motivation   我们已经介绍了大量分布式程序使用的Spark操作.目前为止,我们的例子都是从一个本地集合和规整文件中加载数据,但是有可能你的数据不是规整的或者不在一台机器上,那么就跟着我一起探索加载和保存数据的操作用法.   Spark支持广泛的输出输入源,部分原因是因为Spark构建在Haddoop生态环境之上.S…
第2章 RDD编程 2.1 编程模型 在Spark中,RDD被表示为对象,通过对象上的方法调用来对RDD进行转换.经过一系列的transformations定义RDD之后,就可以调用actions触发RDD的计算,action可以是向应用程序返回结果(count, collect等),或者是向存储系统保存数据(saveAsTextFile等).在Spark中,只有遇到action,才会执行RDD的计算(即延迟计算),这样在运行时可以通过管道的方式传输多个转换. 要使用Spark,开发者需要编写一…