有人能解释一下RDD转换的结果是什么吗?它是新的数据集(数据的副本)还是仅是到旧数据块的过滤指针的新集合?
RDD 转换允许您在 RDD 之间创建依赖关系。这些依赖关系是生成结果(程序)的步骤。每个 RDD 在血统链中(依赖关系的字符串)都有一个用于计算其数据的函数,以及指向其父 RDD 的指针(依赖项)。Spark 将把 RDD 依赖关系分成阶段和任务,并将它们发送到工作节点执行。
因此,如果您这样做:
val lines = sc.textFile("...")
val words = lines.flatMap(line => line.split(" "))
val localwords = words.collect()
words将是一个包含对lines RDD的引用的RDD。当程序被执行时,首先会执行lines函数(从文本文件中加载数据),然后在结果数据上执行words函数(将行拆分为单词)。Spark是惰性的,因此除非调用一些触发作业创建和执行的转换或操作(例如在此示例中使用collect),否则不会执行任何操作。
因此,一个RDD(包括转换后的RDD)不是“一组数据”,而是程序中的一步(可能是唯一的一步),告诉Spark如何获取数据以及要对其执行什么操作。
转换操作是基于现有RDD创建新的RDD。基本上,RDD是不可变的。 Spark中的所有转换都是惰性的。RDD中的数据在执行操作之前不会被处理。
RDD转换的示例: map、filter、flatMap、groupByKey和reduceByKey。
count
,各种缩减方法等)将导致应用传输。checkpoint
方法也应用所有RDD操作,并返回一个结果为传输的RDD,但没有谱系(这可以是性能优势,特别是对于迭代应用)。