阅读目录
RDD
1、RDD(Resilient Distributed Datasets)弹性的分布式数据集,又称Spark core,它代表一个只读的、不可变、可分区,里面的元素可分布式并行计算的数据集。
2、RDD主要有两大类操作,分别为转换(Transformations)和行动(Actions),转换操作通过某种函数将一个RDD转换为一个新的RDD,但是转换操作是懒操作,不会立即执行计算。而行动操作是用于触发转换操作的操作,这个时候才会真正开始计算。
3、常用的Transformations函数
函数 | 描述 |
---|---|
map(func) | 对RDD数据集中的每个元素都使用func,返回一个新的RDD |
filter(func) | 对RDD数据集中的每个元素都使用func,返回使func为true的元素构成的RDD |
flatMap(func) | 和map类似,但是flatMap生成的是多个结果 |
union(otherDataset) | 返回一个新的dataset,包含源dataset和给定dataset的元素的集合 |
grouplyKey(num Tasks) | 返回( K,Seq[V] ),根据相同的键分组 |
reducclykey(func [numTasks]) | 用一个给定的func作用在grouplyKey 而产生的(K,Seq[V),比如求和 |
4、常用的Actions函数
函数 | 描述 |
---|---|
reduce( func) | 通过函数func聚集数据集中的所有元素。func函数接收两个参数,返回一个值 |
collect() | 返回数据集中所有的元素 |
count() | 返回数据集中所有元素的个数 |
first0) | 返回数据集中的第一个元素 |
take(n) | 返回前n个元素 |
saveAsTextFile(path) | 将数据集的元素以textfile的形式保存到本地文件系统、hdfs或者任何其他Hadoop支持的文件系统。Spark将会调用每个元素的toString方法,并将它转换为文件中的一行文本 |
foreach(func) | 对数据集中的每个元素都执行函数func |
一、创建RDD
1、从对象集合创建RDD
spark可以通过parallelize()或makeRDD()方法将一个对象集合转化为RDD
scala> val rdd=sc.parallelize(List(1,2,3,4,5,6))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24
scala> val rdd=sc.makeRDD(List(1,2,3,4,5,6))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at makeRDD at <console>:24
从返回信息可以看出,上述创建的RDD中存储的是Int类型数据,实际上,RDD也是一个集合,与常用的List集合不同的是,RDD集合的数据分布在多台计算机上。
2、从外部存储创建RDD
(1)从HDFS文件创建RDD
直接通过textFile命令读取HDFS文件的位置即可。
scala> val rdd=sc.textFile("/WordCount/words.txt")
rdd: org.apache.spark.rdd.RDD[String] = /WordCount/words.txt MapPartitionsRDD[3] at textFile at <console>:24
scala> rdd.collect
res0: Array[String] = Array(hello hadoop, hello spark, hello scala)
(2)从Linux本地文件创建RDD
本地文件读取也是通过sc.textFile(“路径”)的方法,在路径前面加上“file://”表示从本地Linux文件系统读取。
scala> val rdd=sc.textFile("file:///usr/local/spark/words.txt")
rdd: org.apache.spark.rdd.RDD[String] = file:///usr/local/spark/words.txt MapPartitionsRDD[7] at textFile at <console>:24
scala> rdd.collect
res2: Array[String] = Array(hello hadoop, hello spark, hello scala)
从上述rdd.collect的输出内容可以看到,textFile()方法将源文件中的内容按行拆分成了RDD集合中的多个元素。
二、转换算子
1、map()算子
map()是一种基础的RDD转换操作,它接收一个函数作为参数,并把这个函数应用于RDD的每个元素,最后将函数的返回结果作为结果RDD中对应元素的值。
例如,将rdd1中的每个元素加1(_+1等同于x=>x+1)并返回一个名为rdd2的新RDD:
scala> val rdd1