Spark笔记:RDD基本操作(下)
上一篇里我提到可以把RDD当作一个数组,这样我们在学习spark的API时候很多问题就能很好理解了。上篇文章里的API也都是基于RDD是数组的数据模型而进行操作的。
Spark是一个计算框架,是对mapreduce计算框架的改进,mapreduce计算框架是基于键值对也就是map的形式,之所以使用键值对是人们发现世界上大部分计算都可以使用map这样的简单计算模型进行计算。但是Spark里的计算模型却是数组形式,RDD如何处理Map的数据格式了?本篇文章就主要讲解RDD是如何处理Map的数据格式。
Pair RDD及键值对RDD,Spark里创建Pair RDD也是可以通过两种途径,一种是从内存里读取,一种是从文件读取。
首先是从文件读取,上篇里我们看到使用textFile方法读取文件,读取的文件是按行组织成一个数组,要让其变成map格式就的进行转化,代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/*
*
测试文件数据:
*
x01,1,4
x02,11,1
x01,3,9
x01,2,6
x02,18,12
x03,7,9
*
*
*/
val rddFile : RDD[(String,String)] = sc.textFile( "file:///F:/sparkdata01.txt" , 1 ).map
{ x = >
(x.split( "," )( 0 ),x.split( "," )( 1 )
+ "," +
x.split( "," )( 2 ))
}
val rFile : RDD[String] = rddFile.keys
println( "=========createPairMap
File=========" )
println(rFile.collect().mkString( "," )) //
x01,x02,x01,x01,x02,x03
println( "=========createPairMap
File=========" )
|
我们由此可以看到以读取文件方式构造RDD,我们需要使用map函数进行转化,让其变成map的形式。
下面是通过内存方式进行创建,代码如下:
1 2 3 4 5 |
val rdd : RDD[(String,Int)] = sc.makeRDD(List(( "k01" , 3 ),( "k02" , 6 ),( "k03" , 2 ),( "k01" , 26 )))
val r : RDD[(String,Int)] = rdd.reduceByKey((x,y) = >
x + y)
println( "=========createPairMap=========" )
println(r.collect().mkString( "," )) //
(k01,29),(k03,2),(k02,6)
println( "=========createPairMap=========" )
|
RDD任然是数组形式,只不过数组的元素是("k01",3)格式是scala里面特有的Tuple2及二元组,元组可以当作一个集合,这个集合可以是各种不同数据类型组合而成,二元组就是只包含两个元素的元组。
由此可见Pair RDD也是数组,只不过是一个元素为二元组的数组而已,上篇里对RDD的操作也是同样适用于Pair RDD的。
下面是Pair RDD的API讲解,同样我们先说转化操作的API: