一、Spark对RDD的计算原理
RDD是弹性分布式数据集,即Spark对数据的核心抽象,Spark对数据的操作其实就是对RDD的创建、转换、计算。每个RDD都会分区,这些分区会被Spark自动分发到集群上去并行操作。只有第一次对RDD的计算发生时,Spark才会对RDD进行并行执行,在创建转换的环节先不予操作,这样可以只计算RDD的结果而不是将所有数据先保存再遍历计算,可以节省空间,提高处理速度。
RDD会在每次被处理时进行重新计算,保留最后一次处理的结果数据。如果需要对同一个RDD进行重复计算,可以用 RDD.persist() 将此RDD进行保存,RDD.unpersist()可以将不用的分区移除。
Spark程序的工作方式:
- 外部导入文件创建为RDD
- 使用filter、map等将RDD转换为新的RDD
- 将需要重用的RDD保存起来
- RDD的首次计算发生时,Spark开始对计算进行优化然后并行执行
//创建:获取文件README.md的每行内容并创建为RDD文件
val lines=sc.textFile("README.md")
//创建2:直接将集合传给sc的parallelize转换为RDD
val test=sc.parallelize([1,2,3])
//转换:获取含Python的每行内容转换为RDD文件
val line_python=lines.filter(line => line.contains("python"))
val line_python.persist
//计算1:计算含Python的行数
println(line_python.count())
//计算2:输出含Python的10行
line_python.take(10).foreach(println)
//计算3:输出含Python的所有行
line_python.collect()//collect只适用于可以单机存储的少量结果数据,分布式存储的大数据不能使用
line_python.saveAsTextFile()