[Spark]-RDD之创建
Posted nightpxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Spark]-RDD之创建相关的知识,希望对你有一定的参考价值。
1.RDD的创建
1.1 从一个本地的Scala集合创建
//声明一个本地集合 val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) /** *分布式数据集,有一个重要参数就是数据分片数量(Spark会在每一个分片跑一个task) *本地集合创建,默认情况,Spark会根据你的集群数量自动设置分片数 *也可以手动指定这个数据集的分片(第二个参数) */ //val distData = sc.parallelize(data, 10) //一旦分布式数据集创建完毕,这个数据集就可以并行的被操作 distData.reduce((a, b) => a + b)
1.2 从一个外部的存储系统中创建
这里外部系统,指的是任何Hadoop(InputFormat)支持的存储系统.比如本地文本文件,HDFS,HBase,S3等等
1.2.1 textFile
val distFile = sc.textFile("hdfs://hadoop000:9000/xxx/data.txt") /** *这里纯粹的本地文件是不推荐的 *因为这个文件访问是针对每一个Worker都要是能访问的 * 换言之,如果是本地文件,则必须保证每一个Worker的本地都有一份这个文件 */ //val distFile = sc.textFile("/data.txt") /** *Spark支持文件目录,压缩文件,或者通配符等 */ //val distFile = sc.textFile("hdfs://hadoop000:9000/xxx/*.gz") /** *对于外部文件,Spark会按照128M(HDFS默认),来进行分区 *这里依然可以手动设置分区数.但要注意的是手动设置的分区数必须要大于默认分区数 * 即只允许分的更小,但不能分得更大 */ //val distFile = sc.textFile("hdfs://hadoop000:9000/xxx/*.txt",10) distFile.map(s => s.length).reduce((a, b) => a + b)
1.2.2 wholeTextFiles
wholeTextFiles是用来读取某个文件目录下的多个小文件的.
与textFile的区别是,
textFile 以行断符为分割.一个记录就是一行
wholeTextFiles 是以文件为分割,一个记录就是一个文件内的全部内容
wholeTextFiles的默认情况,可能导致分区数太小.这时可以手动设置调高分区数
1.2.3 sequenceFile[K, V]
将数据集中的元素以Hadoop Sequence文件的形式保存到指定的本地文件系统、HDFS或其它Hadoop支持的文件系统中。
该操作只支持对实现了Hadoop的Writable
接口的键值对RDD进行操作。
在Scala中,还支持隐式转换为Writable的类型(Spark包括了基本类型的转换,例如Int、Double、String等等)
1.2.4 hadoopRDD
对于其它的Hadoop InputFormats,可以hadoopRDD读取.
传入JobConf,input format class,key class and value class(与MapReduce任务设置相同),就可以直接以MapReduce作为输入源进行读取
newAPIHadoopRDD
1.2.5 saveAsObjectFile
将数据集中的元素以简单的Java序列化的格式写入指定的路径。这些保存该数据的文件,可以使用SparkContext.objectFile()进行加载
以上是关于[Spark]-RDD之创建的主要内容,如果未能解决你的问题,请参考以下文章
大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Cor