Apache spark apachespark中的转换过程

Apache spark apachespark中的转换过程,apache-spark,rdd,Apache Spark,Rdd,转换基于现有RDD创建新的RDD。基本上,RDD是不可变的,Spark中的所有转换都是惰性的。RDD中的数据在执行操作之前不会被处理,但在不处理数据的情况下,如何创建新的RDD??例如,在filter操作中,如何在不实际将RDD加载到内存并进行处理的情况下创建新的RDD?Spark转换在操作中是惰性的。这些操作不会立即计算,它只是记住应用于RDD的转换,并返回指向操作输出的指针。仅当对转换操作应用操作时,才会计算转换操作。一旦应用了操作,spark将操作分解为任务,并将它们分发到节点上执行 问题

转换基于现有RDD创建新的RDD。基本上,RDD是不可变的,Spark中的所有转换都是惰性的。RDD中的数据在执行操作之前不会被处理,但在不处理数据的情况下,如何创建新的RDD??例如,在
filter
操作中,如何在不实际将RDD加载到内存并进行处理的情况下创建新的RDD?

Spark转换在操作中是惰性的。这些操作不会立即计算,它只是记住应用于RDD的转换,并返回指向操作输出的指针。仅当对转换操作应用操作时,才会计算转换操作。一旦应用了操作,spark将操作分解为任务,并将它们分发到节点上执行

问题:例如,在筛选器操作中,如何在没有 实际上是将RDD加载到内存中并对其进行处理吗

Apache Spark中的转换过程:

例如:

firstRDD=spark.textFile("hdfs://...")

secondRDD=firstRDD.filter(someFunction);

thirdRDD = secondRDD.map(someFunction);

result = thirdRDD.count()
由于RDD是通过一组转换创建的,它记录这些转换,而不是实际数据(这类似于行动计划,说明如果我们使用此特定的预处理进行过滤,需要做什么)。这些转换的图被称为沿袭图,如下所示

上述示例中的Spark RDD沿袭图为:

请看 仅当使用
过滤器遇到该谓词时,它才会创建新的RDD。。
这就像是行动计划。只有在调用像
count
这样的操作时,才会执行此计划

/*** Return a new RDD containing only the elements that satisfy a predicate.
       */
      def filter(f: T => Boolean): RDD[T] = withScope {
        val cleanF = sc.clean(f)
        new MapPartitionsRDD[T, T](
          this,
          (context, pid, iter) => iter.filter(cleanF),
          preservesPartitioning = true)
      }
  • 延迟计算意味着,当我们调用RDD上的转换(例如,调用map())时,操作不会立即执行
  • 相反,Spark会在内部记录元数据,以指示已请求此操作。 与其将RDD视为包含特定数据,不如将每个RDD视为包含关于如何计算通过转换构建的数据的指令
  • 将数据加载到RDD中是以与转换相同的方式进行惰性评估的。因此,当我们调用sc.textFile()时,直到必要时才会加载数据。与转换一样,操作(在本例中为读取数据)可能会发生多次

惰性评估:(将您的引用“Spark中的所有转换都是惰性的”“更正为“Spark中的所有转换都是惰性评估的””)

Spark第一次在动作中使用RDD时会延迟计算, 这样它就可以管道化转换。因此,在上面的示例RDD中 将仅在调用
count()
操作时进行计算


希望这对…有帮助。

嗨,毗瑟奴,这个博客很有用。谢谢分享。我觉得你多少回答了你自己的问题。过滤的转换是惰性的。在调用需要读取数据的操作之前,不会实际执行筛选器