当在缓存的RDD上执行时,过滤的RDD仍然在缓存中

时间:2017-05-04 13:08:38

标签: scala apache-spark

我想知道我们是否执行了以下说明:

val rdd : = sc.textFile("myfile").zipwithIndex.cache
val size = rdd.count
val filter = rdd.filter(_._2 % 2 == 0)
val sizeF = filter.count

对过滤器RDD执行的操作是否像在缓存中一样执行?尽管我们从第一个RDD创建了第二个RDD,但信息来自同一个地方,所以我想知道它是否被复制到需要缓存的新对象中,或者过滤后的对象是否直接链接到他的父母允许更快的行动?

2 个答案:

答案 0 :(得分:2)

由于filter转换而不是操作,因为spark lazy 以下内容实际上没有做到行:

val filter = rdd.filter(_._2 % 2 == 0)

以下一行:

val sizeF = filter.count

将使用缓存()rdd,并执行filter转换,然后执行count操作

因此,cache转换中没有filter

Spark Guide

  

<强>转换

     

下表列出了一些支持的常见转换   通过Spark。请参阅RDD API文档(Scala,Java,Python,R)并配对   RDD函数doc(Scala,Java)了解详细信息。

     

filter(func)返回通过选择这些元素形成的新数据集   func返回true的源代码。

请注意。如果filter是一个操作,并且创建了新的RDD,则它不会是cached,只有cache()操作在其上执行的RDD是{{1} }。

答案 1 :(得分:0)

没有

子RDD不会被缓存,缓存将保留您工作者中的原始RDD,而其他数据将不会被缓存。

如果您请求此过滤后的RDD其他步骤不会更改数据,则响应始终会很快,因为Spark会将Spark文件保留在工作人员中,直到真正的更改为止。