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 是不可变的,还记得吗????)。 map、filter、flatMap等操作都是变换。
这里有一点需要注意,就是当你对任何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)
谁能解释一下,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 是不可变的,还记得吗????)。 map、filter、flatMap等操作都是变换。
这里有一点需要注意,就是当你对任何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)