Spark RDD的创建
版本信息:Spark2.12,scala2.12.11
Spark创建RDD有三种方式
1.从集合中创建RDD
从集合中创建RDD,Spark提供了两种方式:parallelize和makeRDD
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD Create")
val sc = new SparkContext(sparkConf)
val rdd1: RDD[Int] = sc.parallelize(List(1, 2, 3, 4))
val rdd2: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))
rdd1.collect().foreach(println)
rdd2.collect().foreach(println)
sc.stop()
从底层代码实现来看,其实makeRDD方法就是parallelize方法,使用makeRDD是不是更见名知意了呢
def makeRDD[T: ClassTag](
seq: Seq[T],
numSlices: Int = defaultParallelism): RDD[T] = withScope {
parallelize(seq, numSlices)
}
2.从外部存储中创建RDD
外部存储系统比如:本地文件系统,HDFS或者Hadoop支持的文件系统
文本文件编码必须为UTF-8
从文件中创建RDD,就是将文件中的数据作为处理的数据源
Spark提供了两个读取文本文件的方法:textFile和wholeTextFile
textFile:以行为单位读取数据
wholeTextFile:以文件为单位读取数据,并以键值对的形式返回,key为文件路径,value为文件内容
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("create RDD with file")
val sc = new SparkContext(sparkConf)
// 2.1 从本地文件系统中创建
// path路径默认以当前环境的根路径为基准,可以是绝对路径或相对路径
val rdd: RDD[String] = sc.textFile("F:\\Projects\\BidData\\Spark\\datas\\1.txt")
val rdd1: RDD[String] = sc.textFile("datas/1.txt")
// path路径也可以是目录名称
val rdd2: RDD[String] = sc.textFile("datas")
// path路径可以使用通配符,筛选文件
val rdd3: RDD[String] = sc.textFile("datas/1*.txt")
// 2.2 从HDFS中创建
val rdd4: RDD[String] = sc.textFile("hdfs://master:9000/1.txt")
// wholeTextFiles
val rdd5: RDD[(String, String)] = sc.wholeTextFiles("datas")
// rdd5结果输出:
// (file:/F:/Projects/BidData/Spark/datas/parallelism/1.txt,1 )
// (file:/F:/Projects/BidData/Spark/datas/parallelism/2.txt,hu nan )
// (file:/F:/Projects/BidData/Spark/datas/parallelism/3.txt,chang sha )
rdd5.collect().foreach(println)
sc.stop()
3.从其他RDD中创建
主要是通过一个RDD运算完成后,在产生新的RDD
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparkConf)
val rdd: RDD[Int] = sc.parallelize(List(1, 2, 3, 4))
// 通过map算子转化为新的RDD
val mapRDD: RDD[(Int, Int)] = rdd.map((_, 1))
mapRDD.collect().foreach(println)
sc.stop()