Spark中RDD转换的结果是什么?

What is the result of RDD transformation in Spark?

谁能解释一下,RDD 转换 的结果是什么?它是新的数据集(数据的副本)还是只是新的指针集,指向过滤后的旧数据块?

RDD 转换允许您在 RDD 之间创建依赖关系。依赖关系只是产生结果(程序)的步骤。沿袭链(依赖字符串)中的每个 RDD 都有一个计算其数据的函数,并有一个指向其父 RDD 的指针(依赖)。 Spark 会将 RDD 依赖划分为阶段和任务,并将它们发送给工作人员执行。

所以如果你这样做:

val lines = sc.textFile("...")
val words = lines.flatMap(line => line.split(" "))
val localwords = words.collect()

words 将是一个包含对行 RDD 的引用的 RDD。当程序执行时,第一行的函数将被执行(从文本文件加载数据),然后单词的函数将在结果数据上执行(将行拆分为单词)。 Spark 是惰性的,因此除非您调用一些会触发作业创建和执行的转换或操作(在此示例中为 collect),否则不会执行任何操作。

所以,RDD(也就是经过转换的 RDD)不是 'a set of data',而是程序中的一个步骤(可能是唯一的步骤)告诉 Spark 如何获取数据以及如何处理数据。

转换基于现有的 RDD 创建新的 RDD。基本上,RDD 是不可变的。 Spark 中的所有转换都是 lazy.Data 在 RDD 中,只有在执行操作后才会处理。

RDD 转换示例: 地图、过滤器、flatMap、groupByKey、reduceByKey

正如其他人所提到的,RDD 维护着一个以编程方式应用于它的所有转换的列表。这些是延迟评估的,因此尽管(例如在 REPL 中),您可能会得到不同参数类型的结果(例如,在应用映射之后),'new' RDD 还不包含任何内容,因为没有任何东西迫使原始 RDD 评估其沿袭中的转换/过滤器​​。 count、各种减少方法等方法将导致应用运输。 checkpoint 方法也应用所有 RDD 操作,返回一个 RDD,它是传输的结果但没有沿袭(这可能是一个性能优势,特别是对于迭代应用程序)。

所有答案都完全有效。我只想添加一张快速图片:-)

转换是一种将 RDD 数据从一种形式转换为另一种形式的操作。当你在任何 RDD 上应用这个操作时,你将得到一个新的 RDD,其中包含转换后的数据(Spark 中的 RDD 是不可变的,还记得吗????)。 mapfilterflatMap等操作都是变换。

这里有一点需要注意,就是当你对任何RDD应用转换时,它不会立即执行操作。它将使用应用的操作、源 RDD 和用于转换的函数创建一个 DAG(有向无环图)。它将继续使用引用构建此图,直到您对最后排列的 RDD 应用任何操作操作。这就是为什么 Spark 中的转换是惰性的。

其他答案已经很好的解释了。这是我的一些美分:

要清楚返回的 RDD 里面有什么,最好检查一下 RDD 摘要里面有什么class(引用自源代码):

Internally, each RDD is characterized by five main properties:

  • A list of partitions
  • A function for computing each split
  • A list of dependencies on other RDDs
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)