Spark入门RDD操作

来源:互联网 发布:小米文件管理器源码 编辑:程序博客网 时间:2024/05/17 21:55

RDD(Resilient Distributed Datasets),弹性分布式数据集,是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD.从编程的角度来看,RDD可以简单看成是一个数组.和普通数组的区别是,RDD中的数据是分区存储的,这样不同分区的数据就可以分布在不同的机器上,同时可以被并行处理。因此,Spark应用程序所做的无非是把需要处理的数据转换为RDD,然后对RDD进行一系列的变换和操作从而得到结果.Spark简单RDD入门操作。
启动spark-shell
./bin/spark-shell //启动一个spark驱动器程序driver program。默认创建了一个SparkContext对象,是一个sc的变量.
1.map
是对RDD中的每个元素都执行一个指定的函数产生一个新的RDD.任何原RDD中的元素在新RDD中都有且只有一个元素与之对应.
(1)把原RDD中每个元素都乘以2来产生一个新的RDD

scala> val a = sc.parallelize(1 to 9, 3)        scala> val b = a.map(x => x*2)              //只生成了1-9的九个数字scala> a.collectres10: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)scala> b.collectres11: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18)

(2)与上述的map方法的调用时相同的

scala> val textFile = spark.read.textFile("README.md")scala> val textMap = textFile.map(line => line.split(" ").size)

2.reduce
是将RDD中元素两两传递给输入函数,同时产生一个新的值,新产生的值与RDD中下一个元素再被传递给输入函数直到最后只有一个值为止.
2.1对RDD中的元素求和

scala> val c = sc.parallelize(1 to 10)scala> c.reduce((x, y) => x + y)res4: Int = 55scala> textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)

3.map和reduce的使用

scala> textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)res4: Long = 15

4.flatMap
与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatMap处理后可生成多个元素来构建新RDD.
(1)对原RDD中的每个元素x产生y个元素

scala> val a = sc.parallelize(1 to 4, 2)scala> val b = a.flatMap(x => 1 to x)   //生成了1和1,2和1,2,3和1,2,3,4十个数字scala> b.collectres12: Array[Int] = Array(1, 1, 2, 1, 2, 3, 1, 2, 3, 4)

调用flatMap将数据集转换为字数据集,然后合并groupByKey并count计算文件中的每字计数作为(String,Long)对的数据集。要在shell中收集字数,我们可以调用collect.

scala> val wordCounts = textFile.flatMap(line => line.split(" ")).groupByKey(identity).count()wordCounts: org.apache.spark.sql.Dataset[(String, Long)] = [value: string, count(1): bigint]scala> wordCounts.collectres12: Array[(String, Long)] = Array((online,1), (graphs,1), (["Parallel,1), (["Building,1), (thread,1), (documentation,3), (command,,2), (abbreviated,1),...)

5.标记缓存
将我们的linesWithSpark数据集标记为缓存,当数据被重复访问.
org.apache.spark.storage.StorageLevel类的缓存级别:
这里写图片描述

scala> linesWithSpark.cache //cache 默认的缓存级别与persist一致,都是StorageLevel.MEMORY_ONLY,可以用unpersist来取消缓存
res14: linesWithSpark.type = [value: string]

scala> linesWithSpark.count
res15: Long = 20

scala> linesWithSpark.count
res16: Long = 20

6.Spark RDD API 操作
6.1对链表为List(1,2,3,3)的如下一元转换操作
这里写图片描述
6.2对链表为List(1,2,3)和List(3,4,5)的如下二元转换操作
这里写图片描述
6.3对链表为List(1,2,3,3)的如下行动操作
这里写图片描述