文章目录
RDD中的数据可以来源于2个地方:本地集合或者外部数据源
- 本地集合:自定义的Scala集合
- 外部数据源:文件或文件夹
- 将 本地集合/外部数据源 转化为RDD
- sc.parallelize(本地集合,分区数)
注:若不指定分区数,则该方法会占用 集群/本地机器 全部资源
- sc.makeRDD(本地集合,分区数)
注:该方法底层使用parallelize
- sc.textFile(本地文件/HDFS文件/文件夹,分区数)
注:
- 不要用它读取大量小文件
- 若不指定分区数,读取文件最小占用两个线程
- sc.wholeTextFile(本地文件夹/HDFS文件夹,分区数)
注:
- 该方法专门用来读取小文件
- 若不指定分区数,则一个小文件占用一个线程
2.获取RDD分区数
- rdd.getNumPartitions
获取rdd的分区数,底层是partitions.length
- rdd.partitions.length
获取rdd的分区数
代码演示
object RDDDemo01_Create {
def main(args: Array[String]): Unit = {
//TODO 0.env/创建环境
val conf: SparkConf = new SparkConf().setAppName("spark").setMaster("local[*]")
val sc: SparkContext = new SparkContext(conf)
sc.setLogLevel("WARN")
//TODO 1.source/加载数据/创建RDD
val rdd1: RDD[Int] = sc.parallelize(1 to 10) //8
val rdd2: RDD[Int] = sc.parallelize(1 to 10,3) //3
val rdd3: RDD[Int] = sc.makeRDD(1 to 10)//底层是parallelize //8
val rdd4: RDD[Int] = sc.makeRDD(1 to 10,4) //4
//RDD[一行行的数据]
val rdd5: RDD[String] = sc.textFile("data/input/words.txt")//2
val rdd6: RDD[String] = sc.textFile("data/input/words.txt",3)//3
//RDD[一行行的数据]
val rdd7: RDD[String] = sc.textFile("data/input/ratings10")//10
val rdd8: RDD[String] = sc.textFile("data/input/ratings10",3)//10
//RDD[(文件名, 一行行的数据),(文件名, 一行行的数据)....]
val rdd9: RDD[(String, String)] = sc.wholeTextFiles("data/input/ratings10")//2
val rdd10: RDD[(String, String)] = sc.wholeTextFiles("data/input/ratings10",3)//3
println(rdd1.getNumPartitions)//8 //底层partitions.length
println(rdd2.partitions.length)//3
println(rdd3.getNumPartitions)//8
println(rdd4.getNumPartitions)//4
println(rdd5.getNumPartitions)//2
println(rdd6.getNumPartitions)//3
println(rdd7.getNumPartitions)//10
println(rdd8.getNumPartitions)//10
println(rdd9.getNumPartitions)//2
println(rdd10.getNumPartitions)//3
//TODO 2.transformation
//TODO 3.sink/输出
}
}