半岛平台 - 半岛控股有限公司官网 | 激光切割智能化系统服务商

半岛官方网站:Spark学习笔记2:RDD编程

2026-07-12

  

半岛官方网站:Spark学习笔记2:RDD编程(图1)

  运行Spark应用,首先需要导入Spark包,这里使用Maven来连接公共仓库中的Spark包。

  接下来创建一个SparkConf来配置应用,这里使用local即本地模式,方便调试代码。

  有了SparkContext以后,就可以来访问Spark,创建RDD。sc.parallelize创建了一个Seq对象 RDD,可以对这个RDD进行操作。flatmap和map就是对这个RDD进行的一些操作完成单词计数,这些操作接下来将进行解释,最后将结果在后台显示出来。这样一个简单的Spark应用就完成了。

  前一章介绍过RDD即弹性分布式数据集,是Spark对数据的核心抽象,RDD就是分布式的元素集合。

  Spark对数据的操作无外乎创建RDD,转化已有RDD以及调用RDD操作进行求值。Spark会自动将RDD中的数据分发到集群上,并将操作并行化执行。

  可以使用两种方法创建RDD:读取一个外部数据集,或在驱动器程序里分发驱动器程序中的对象集合。

  还可以把程序中一个已有的集合传给SparkContext的parallelize()方法 如我们上面单词计数例子里的那样。

  RDD的转化操作是返回新的RDD的操作,转化出来的RDD是惰性求值的,只有在行动操作中用到这些RDD时才会被计算。

  map()操作用于接收一个函数,把这个函数用于RDD中的每个元素,将函数的返回结果作为结果RDD中对应元素的值。如 val counts = words.map(word =(word,1)) 将每一个单词单词映射成键值对。

  filter()接受函数,将RDD中满足该函数的元素放入新的RDD中返回。

  flatMap()被分别应用到输入RDD的每个元素上,返回的是一个包含各个迭代器可访问的所有元素的RDD。可以用于将输入的字符串切分成单词。

  集合操作:distinct() 生成只包含不同元素的新RDD, union(other)返回一个包含两个RDD中所有元素的RDD , intersection(other)只返回两个RDD中都有的元素,subtract(other)返回只存在于第一个RDD而不存在于第二个RDD中的元素,cartesian(other)笛卡儿积,返回所有可能的(a,b)对,a,b分别来自两个不同的RDD。

  最终这个分区得到 (6,3) 即表示和为6,有3个元素。同样,另外两个分区得到(15,3) (34,4)

  Spark在每次调用行动操作时都会重算RDD以及它的所有依赖,为了避免多次计算同一个RDD,可以让Spark对数据进行持久化。

  持久化数据所在的节点发生故障半岛官方网站时,Spark会在需要用到缓存的数据时重算丢失的数据分区。最好的做法是将数据备份到多个节点上。

  使用persist()用来把数据以序列化的形式缓存,默认情况下会缓存在JVM的堆空间中。如果缓存的数据太多,内存中放不下,Spark会自动利用最近最少使用的缓存策略把最老的分区从内存中移除。