inputRDD = sc.textFile("log.txt")
errorsRDD = inputRDD.filter(lambda x: "error" in x)
warningsRDD = inputRDD.filter(lambda x: "warning" in x)
badLinesRDD = errorsRDD.union(warningsRDD)
badLinesCount = badLinesRDD.count()
warningCount = warningsRDD.count()
在上面的代码中,在执行badLinesRDD中的对象数量之前执行第二行到最后一行代码时,不会评估任何转换。因此,当运行此badLinesRDD.count()
时,它将计算前四个RDD直到联合并返回结果。但是当warningsRDD.count()
运行时,它只计算转换RDD直到前三行,并返回正确的结果?
当在对它们调用动作时计算这些RDD转换时,哪个是最后一个RDD转换的对象,哪个是union,存储?它是否存储在并行运行过滤器转换的每个DataNode的内存中?
答案 0 :(得分:3)
除非任务输出显式保持(例如cache
,persist
)或隐式(随机写入),并且有足够的可用空间,每个操作都将执行完整的沿袭。
因此,当您致电warningsRDD.count()
时,它会加载文件(sc.textFile("log.txt")
)并过滤(inputRDD.filter(lambda x: "warning" in x)
)。
当在对它们调用动作时计算这些RDD转换时,哪个是最后一个RDD转换的对象,哪个是union,存储?
假设数据没有持久存在,无处可去。数据传递到下一个阶段或输出后,将丢弃所有任务输出。如果数据持久存在,则取决于设置(磁盘,堆上,堆外,DFS)。