学习Spark基础你必须了解的RDD编程
Spark对数据的核心抽象——弹性分布式数据集(
Resilient Distributed Dataset,简称
RDD)
在Spark中,对数据的所有操作无外乎创建RDD、转化已有RDD以及调用RDD操作进行求值。
1 RDD基础
1 RDD基础
Spark中的RDD就是一个不可变的分布式对象集合。
每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。
RDD支持两种类型的操作:
转化操作(
transformation)和行动操作(
action)
转化操作和行动操作的区别在于Spark计算RDD的方式不同。虽然你可以在任何时候定义新的RDD,但Spark只会惰性计算这些RDD。它们只有第一次在一个行动操作中用到时,才会真正计算。
默认情况下,SparkRDD会在你每次对它们进行行动操作时重新计算。
默认不进行持久化对于大规模数据集是很有意义的:如果不会重用该RDD,我们就没有必要浪费存储空间,Spark可以直接遍历一遍数据然后计算结果。
2 创建RDD
2 创建RDD
两种方式:
读取外部数据集;
val lines = sc.textFile(“./README.md”) 在驱动器程序中对一个集合进行并行化
val lines = sc.parallelize(list(“pandas”, “i like it”))
3 RDD操作
3 RDD操作
转化操作是返回一个新的RDD的操作,比如
map()
filter()。
行动操作是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际计算,比如
count()
first()。
4 向Spark传递函数
4 向Spark传递函数
python 可以使用 lambda 表达式。
scala 可以把定义的内联函数、方法的引用或静态方法传递给spark。
所传递的函数及其引用的数据需要是可序列化的。
如果Scala中出现NotSerializableException,通常问题就在于我们传递了一个不可序列化的类中的函数或字段。
Java 函数需要作为实现Spark的org.apache.apark.api.java.function包中的任一函数接口的对象来传递。根据不同的返回类型,定义了一些不同的接口。