我们可以防止Apache Spark Transformation的懒惰吗?

时间:2016-03-16 10:28:55

标签: apache-spark

最近,一位雇主问我一个问题,我们怎样才能防止Apache Spark变换的懒惰。我知道我们可以持久化并缓存RDD数据集但是如果发生故障,它会从父级重新计算。

任何人都可以解释一下,是否有任何功能可以阻止Spark转换的懒惰?

1 个答案:

答案 0 :(得分:0)

按照设计,Spark 转换是懒惰的,您必须使用操作才能从中检索具体的值。

例如,以下转换将始终保持惰性:

JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());

map之类的功能会返回RDD,您只能通过执行reduce等操作将这些RDD转换为实际值:

int totalLength = lineLengths.reduce((a, b) -> a + b);

没有标志会使map返回具体值(例如,整数列表)。

最重要的是,您可以使用collect或任何其他Spark动作来防止懒惰&#39;转型:

JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());
List<Integer> collectedLengths = lineLengths.collect()

请记住,在大型数据集上使用collect可能是一种非常糟糕的做法,使您的驱动程序内存不足。