NightPxy 个人技术博客

RDD-创建

Posted on By NightPxy

从本地集合创建

//声明一个本地集合
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)

从一个外部的存储系统中创建

外部系统

这里外部系统,指的是任何Hadoop(InputFormat)支持的存储系统.
比如本地文本文件,HDFS,HBase,S3等等

注意点

对于外部文件,Spark会按照128M(HDFS默认),来进行分区
这里可以手动设置分区.但需要注意的是手动设置的分区数必须要大于默认分区数
即只能增大分区,不能减小分区.(减小分区无效)

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")
	
/**
*手动调整分区
*/
//val distFile = sc.textFile("hdfs://hadoop000:9000/xxx/*.txt",10)
	
distFile.map(s => s.length).reduce((a, b) => a + b)

wholeTextFiles

wholeTextFiles是用来读取某个文件目录下的多个小文件的
wholeTextFiles的默认分区,可能导致分区数太小.这时可以手动设置调高分区数

与textFile的区别

textFile 以行断符为分割.一个记录就是一行
wholeTextFiles 是以文件为分割,一个记录就是一个文件内的全部内容

sequenceFile[K, V]

将数据集中的元素以Hadoop Sequence文件的形式保存到指定的本地文件系统、HDFS或其它Hadoop支持的文件系统中

  • 该操作只支持对实现了Hadoop的Writable接口的键值对RDD进行操作
  • 在Scala中,还支持隐式转换为Writable的类型(Spark包括了基本类型的转换,例如Int、Double、String等等)

hadoopRDD

对于其它的Hadoop InputFormats,可以hadoopRDD读取
传入JobConf,input format class,key class and value class(与MapReduce任务设置相同),就可以直接以MapReduce作为输入源进行读取

saveAsObjectFile

将数据集中的元素以简单的Java序列化的格式写入指定的路径.
这些保存该数据的文件,可以使用SparkContext.objectFile()进行加载