有3种方式可以创建RDD。分别如下介绍:
1、由集合创建RDD
Spark会将集合中的数据拷贝到集群上去,形成一个分布式的数据集合,也就是一个RDD;相当于集合中的一部分数据会到一个节点上,而另一部分数据会到其他节点上;然后就可以用并行的方式来操作这个分布式数据集合。
val rdd = sc.parallelize(List(1,2,3,4,5,6)
rdd.count
val rdd = sc.parallelize(List(1,2,3,4,5,6),3)
rdd.count
上面两种写法结果是一样的,只是分区数不一样。通过WebUI可以发现它们的任务数量不一样。从RDD的特性来看,有多少个分区就有多少个任务,它们之间是一 一对应的。
2、加载文件成RDD
通过调用SparkContext的textFile()方法,可以读取本地文件或HDFS文件创建RDD,文件中的每一行就是RDD中的一个元素。
# 准备处理的数据:hello.txt
hello world hello
hello welcome world
#Spark处理本地文件
val distFile = sc.textFile("file:///root/hello.txt")
#Spark处理HDFS上的文件
cd ~/data
hadoop fs -put hello.txt / #上传本地文件到HDFS
val disFile = sc.textFile("hdfs://192.168.48.141:8020/hello.txt")
disFile.count
注意事项:
(1)如果是在本地测试本地文件,有一份文件即可;如果是在Spark集群上测试本地文件,需要将文件拷贝到所有Worker Node上。因为Spark是分布式执行的,任务会被分配到不同的节点上去执行。
(2)Spark的textFile()方法支持针对目录、压缩文件以及通配符进行RDD创建。
————————————————
textFile("/my/directory")
textFile("/my/directory/*.txt")
(3)Spark默认会为HDFS文件的每一个数据块创建一个分区,但是也可以通过textFile()的第二个参数手动设置分区数量,只能比数据块数量多,不能比数据块数量少。
3、通过RDD的转换形成新的RDD
具体如下面(RDD的转换算子)的描述。