Spark应用程序需要验证RDD中的每个元素。
给定一个名为Validator
的驱动程序\客户端Scala对象,以下两种解决方案中的哪一种更好:
rdd.filter { x => if Validator.isValid(x.somefield) true else false }
或类似
// get list of the field to validate against
val list = rdd.map(x => x.somefield)
// Use the Validator to check which ones are invalid
var invalidElements = Validator.getValidElements().diff(list)
// remove invalid elements from the RDD
rdd.filter(x => !invalidElements.contains(x.somefield))
第二种解决方案避免在传递给RDD的函数中引用驱动程序端对象。在客户端上确定无效元素,然后将该列表传递回RDD。
或者既不推荐?
由于
答案 0 :(得分:2)
如果我理解正确(即你有一个object Validator
),那不是驱动程序代码,因为你的工作的Jar也会分发给工人。因此,您定义的Scala对象也将在执行程序JVM中实例化。 (这也是为什么你没有收到序列化异常而不是使用作业中定义的方法,例如在带有检查点的Spark Streaming中)。
第一个版本应该更好,因为您先过滤。映射所有数据然后过滤它会更慢。
第二个版本也存在问题,因为如果要在驱动程序上创建有效元素列表,则现在必须将其发送回工作者。