2015-10-17 66 views
0

我使用Elasticsearch的Pyspark。我注意到,当你创建一个RDD时,它不会在任何收集,计数或任何其他“最终”操作之前执行。Pyspark with Elasticsearch

是否有执行和缓存已转换的RDD,因为我也将转换后的RDD的结果用于其他事情。

+1

Spark中的所有转换都是懒惰的,因为它们不会马上计算结果。相反,他们只记得应用于某些基础数据集(例如文件)的转换。转换仅在动作需要将结果返回给驱动程序时计算。这种设计使Spark能够更高效地运行 - 例如,我们可以认识到,通过map创建的数据集将用于reduce,并仅将reduce的结果返回给驱动程序,而不是更大的映射数据集。没有别的办法。 – eliasah

+1

如果需要,您可以在缓存后执行计数,但我没有看到这样做的目的。 – eliasah

回答

2

就像我在评论区说,

Spark中所有的转化都是,因为它们不计算其结果的时候了。相反,他们只记得应用于某些基础数据集(例如文件)的转换。转换仅在动作需要将结果返回给驱动程序时计算。这种设计使Spark能够更高效地运行 - 例如,我们可以认识到,通过map创建的数据集将用于reduce,并仅将reduce的结果返回给驱动程序,而不是更大的映射数据集。

没有别的办法。

为什么懒惰?

函数编程的延迟计算的好处:

  • 性能通过避免不必要的计算的增加,并且在评估化合物表达式错误条件
  • 构造可能是无限的数据结构
  • 定义的能力的能力控制结构作为抽象而不是原语

注意:大多数新的函数式编程语言都是懒惰的(例如Haskell,Scala)。即使认为你使用的是Python,Spark也是用Scala编写的。但是,如果您想在每次RDD定义后计算RDD,则可以在缓存后执行count操作(如果需要),但我没有看到这样做的目的。需要时您最终会获得RDD。

+1

感谢您的明确回答:) –