一、parallelize
调用SparkContext 的 parallelize(),将一个存在的集合,变成一个RDD,这种方式试用于学习spark和做一些spark的测试
scala版本
def parallelize[T](seq: Seq[T], numSlices: Int = defaultParallelism)(implicit arg0: ClassTag[T]): RDD[T]
- 第一个参数一是一个 Seq集合
- 第二个参数是分区数
- 返回的是RDD[T]
案例:
scala> sc.parallelize(List("hello world","hello scala","hello spark"))
res0: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:25
Java版本
java版本只能接收List的集合
def parallelize[T](list : java.util.List[T], numSlices : scala.Int) : org.apache.spark.api.java.JavaRDD[T] = { /* compiled code */ }
- 第一个参数是一个List集合
- 第二个参数是一个分区,可以默认
- 返回的是一个JavaRDD[T]
案例:
SparkConf conf = new SparkConf().setAppName("java1").setMaster("local[*]");
JavaSparkContext sc = new JavaSparkContext(conf);
List<String> strings = Arrays.asList("hello world", "hello java", "hello spark");
JavaRDD<String> rdd1 = sc.parallelize(strings);
List<String> collect = rdd1.collect();
for (String value:
collect) {
System.out.println(value);
}
二、makeRDD
只有scala版本的才有makeRDD
def makeRDD[T](seq : scala.Seq[T], numSlices : scala.Int = { /* compiled code */ })
跟parallelize类似
案例:
scala> sc.makeRDD(List("hello world","hello java","hello spark"))
res1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[1] at makeRDD at <console>:25
三、textFile
调用SparkContext.textFile()方法,从外部存储中读取数据来创建 RDD
例如在我本地F:\dataexample\wordcount\input下有个sample.txt文件,文件随便写了点内容,我需要将里面的内容读取出来创建RDD
案例:
在项目中创建src同级目录in,并在此目录中创建word.txt文件
word.txt文件内容如下:
hello world
hello kb09
hello scala
scala版本
//使用本地文件创建RDD
//绝对路径
val lines: RDD[String] = sc.textFile("E:\\qianchun\\Scala\\kb09\\sparkdemo\\in\\word.txt")
lines.collect.foreach(println)
//相对路径
val lines2: RDD[String] = sc.textFile("in/word.txt")
lines2.collect.foreach(println)
println("-------------HDFS----------------")
//使用HDFS文件创建RDD
val linesHDFS: RDD[String] = sc.textFile("hdfs://hadoop001:9000/data/spark/word.txt")
linesHDFS.collect.foreach(println)
//通配符形式
val linesHDFS2: RDD[String] = sc.textFile("hdfs://hadoop001:9000/data/spark/*2.txt")
linesHDFS2.collect.foreach(println)
Java版本
System.out.println("------------本地文件---------------");
JavaRDD<String> stringJavaRDD = sc.textFile("in/word.txt");
List<String> collect1 = stringJavaRDD.collect();
for (String str:
collect1) {
System.out.println(str);
}
System.out.println("-------------HDFS文件--------------");
JavaRDD<String> stringHDFSJavaRDD = sc.textFile("hdfs://hadoop001:9000/data/spark/word.txt");
List<String> collect2 = stringHDFSJavaRDD.collect();
for (String str1:
collect2) {
System.out.println(str1);
}
注:
textFile支持分区,支持模式匹配,例如把F:\dataexample\wordcount\目录下inp开头的给转换成RDD
var lines = sc.textFile("F:\\dataexample\\wordcount\\inp*")
多个路径可以使用逗号分隔,例如:
var lines = sc.textFile("dir1,dir2",3)