Spark RDD 创建(一)

 

 spark 官网apihttp://spark.apache.org/docs/1.6.0/programming-guide.html

 

RDD两种创建方式: 

1:SparkContext’s parallelize 常用于测试

2:读取 外部数据集  如本地文件(linux ,...)或HDFS文件系统 ,HBASE ,HIVE 等

数组创建RDD

scala>val array = Array(1,2,3,4,5)

array: Array[Int] = Array(1, 2, 3, 4, 5)

scala>val rdd = sc.parallelize(array)

rdd: org.apache.spark.rdd.RDD[Int] =ParallelCollectionRDD[13] at parallelize at <console>:29

可以看出,rdd是一个Int类型的RDD。

上面使用数组来创建,或者,也可以从列表中创建:

scala>val list = List(1,2,3,4,5)

list: List[Int] = List(1, 2, 3, 4, 5)

scala>val rdd = sc.parallelize(list)

rdd: org.apache.spark.rdd.RDD[Int] =ParallelCollectionRDD[14] at parallelize at <console>:29

从执行结果信息可以看出,rdd是一个Int类型的RDD。

 

从文件系统中加载数据创建RDD

Spark采用textFile()方法来从文件系统中加载数据创建RDD,该方法把文件的URI作为参数,这个URI可以是本地文件系统的地址,或者是分布式文件系统HDFS的地址,或者是Amazon S3的地址等等。

下面请切换回spark-shell窗口,看一下如何从本地文件系统中加载数据:

scala> val f =sc.textFile("file:///opt/software/emp.txt")

f: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[24] at textFile at <console>:277

从执行结果反馈信息可以看出,f是一个String类型的RDD, 

scala> val lines =sc.textFile("hdfs://localhost:9000/user/hadoop/word.txt")

scala> val lines =sc.textFile("/user/hadoop/word.txt")

scala> val lines =sc.textFile("word.txt")

注意,上面三条命令是完全等价的命令,只不过使用了不同的目录形式,你可以使用其中任意一条命令完成数据加载操作。

在使用Spark读取文件时,需要说明以下几点:

•If using a path on the local filesystem, the file must also be accessible at the same path on worker nodes. Either copy the file to all workers or use a network-mounted shared file system.

•All of Spark’s file-based input methods, including textFile, support running on directories, compressed files, and wildcards as well. For example, you can use textFile("/my/directory"), textFile("/my/directory/*.txt"), and textFile("/my/directory/*.gz").

•The textFile method also takes an optional second argument for controlling the number of partitions of the file. By default, Spark creates one partition for each block of the file (blocks being 64MB by default in HDFS), but you can also ask for a higher number of partitions by passing a larger value. Note that you cannot have fewer partitions than blocks.

 

(1)如果使用了本地文件系统的路径,那么,必须要保证在所有的worker节点上,也都能够采用相同的路径访问到该文件,比如,可以把该文件拷贝到每个worker节点上,或者也可以使用网络挂载共享文件系统。

(2)textFile()方法的输入参数,可以是文件名,也可以是目录,也可以是压缩文件等。比如,textFile("/my/directory"),textFile("/my/directory/*.txt"), andtextFile("/my/directory/*.gz").

(3)textFile()方法也可以接受第2个输入参数(可选),用来指定分区的数目。默认情况下,Spark会为HDFS的每个block创建一个分区(HDFS中每个block默认是64MB)。你也可以提供一个比block数量更大的值作为分区数目,但是,你不能提供一个小于block数量的值作为分区数目。

RDD操作

RDD被创建好以后,在后续使用过程中一般会发生两种操作:

*  转换(Transformation): 基于现有的数据集创建一个新的数据集。

*  行动(Action):在数据集上进行运算,返回计算值。

转换操作Transformation

对于RDD而言,每一次转换操作都会产生不同的RDD,供给下一个“转换”使用。转换得到的RDD是惰性求值的,也就是说,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转换操作。

下面列出一些常见的转换操作(Transformation API):

* filter(func):筛选出满足函数func的元素,并返回一个新的数据集

* map(func):将每个元素传递到函数func中,并将结果返回为一个新的数据集

* flatMap(func):与map()相似,但每个输入元素都可以映射到0或多个输出结果

* groupByKey(([numTasks]):应用于(K,V)键值对的数据集时,返回一个新的((K, Iterable<V>)形式的数据集

* reduceByKey(func, [numTasks]):应用于(K,V)键值对的数据集时,返回一个新的(K, V)形式的数据集,其中的每个值是将每个key传递到函数func中进行聚合

sortByKey([ascending], [numTasks]) :应用于(K,V)键值对的数据集时,更具K返回一个新的(K, V)形式的数据集

 

行动操作

行动操作是真正触发计算的地方。Spark程序执行到行动操作时,才会执行真正的计算,从文件中加载数据,完成一次又一次转换操作,最终,完成行动操作得到结果。

下面列出一些常见的行动操作(Action API):

* count() 返回数据集中的元素个数

* collect() 以数组的形式返回数据集中的所有元素 这通常会在使用filter或者其它操作并返回一个足够小的数据子集后再使用会比较有用。

* first() 返回数据集中的第一个元素(类似于take(1))

* take(n) 以数组的形式返回数据集中的前n个元素注意,这个操作目前并非并行执行,而是由驱动程序计算所有的元素

* reduce(func) 通过函数func(输入两个参数并返回一个值)聚合数据集中的元素

* foreach(func) 将数据集中的每个元素传递到函数func中运行*

  countByKey() 对(K,V)类型的RDD有效,返回一个(K,Int)对的Map,返回每一个key对应的元素个数

  

 

posted @ 2016-01-13 23:38  凯心宝牙  阅读(1372)  评论(0编辑  收藏  举报