我想知道我们是否执行了以下说明:
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,但信息来自同一个地方,所以我想知道它是否被复制到需要缓存的新对象中,或者过滤后的对象是否直接链接到他的父母允许更快的行动?
答案 0 :(得分:2)
由于filter
是转换而不是操作,因为spark lazy 以下内容实际上没有做到行:
val filter = rdd.filter(_._2 % 2 == 0)
以下一行:
val sizeF = filter.count
将使用缓存()rdd
,并执行filter
转换,然后执行count
操作
因此,cache
转换中没有filter
。
<强>转换强>
下表列出了一些支持的常见转换 通过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文件保留在工作人员中,直到真正的更改为止。