[英]Why does using a set in filter cause “org.apache.spark.SparkException: Task not serializable”?
我正在尝试根据列表中这些对象的字段来筛选RDD中的对象集合。
我尝试的方法与此处相同: 基于Spark中另一个RDD的过滤器
val namesToFilterOn = sc.textFile("/names_to_filter_on.txt").collect.toSet
val usersRDD = userContext.loadUsers("/user.parquet")
这有效:
usersRDD.filter(user => Set("Pete","John" ).contains( user.firstName )).first
当我尝试
usersRDD.filter(user => namesToFilterOn.contains( user.firstName )).first
我得到这个错误
org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: org.apache.spark.SparkContext
尝试此操作时遇到的相同错误
val shortTestList = Set("Pete","John" )
usersRDD.filter(user => shortTestList .contains( user.firstName )).first
在这些过滤器语句中指定一组名称/字符串时,为什么会出现此错误?
据我认为这应该工作,我没有在filter语句的任何地方指定SparkContext。 那么为什么会出错呢? 以及如何不得到错误?
我正在使用的Spark版本是1.5.2。
我还尝试过首先广播名称集。
val namesToFilterOnBC = sc.broadcast(namesToFilterOn)
usersRDD.filter(user => namesToFilterOnBC.value.contains( user.firstName )).first
这再次导致相同的错误
org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: org.apache.spark.SparkContext
原因是val namesToFilterOn = sc.textFile("/names_to_filter_on.txt").collect.toSet
属于包含无法序列化val namesToFilterOn = sc.textFile("/names_to_filter_on.txt").collect.toSet
的对象,因此是错误。
当user => namesToFilterOn.contains( user.firstName )
转换为字节格式以通过网络发送给执行者时,Spark将检查是否存在对不可序列化对象的引用,并且SparkContext是否在其中。
似乎Spark找到了一个引用不可序列化SparkContext的地方,并引发了异常。
一种解决方案是将val namesToFilterOn = sc.textFile("/names_to_filter_on.txt").collect.toSet
或val shortTestList = Set("Pete","John" )
为Scala中object
单独方法。 您还可以使用闭包内部的另一个val shortTestList
(如Job由于阶段故障而中止:任务不可序列化中所述 )或广播它。
您可能会发现文件SIP-21-Spores对于这种情况很有帮助 。
询问userContext的开发人员,并通过不显式实例化userContext而是仅导入其功能来解决此问题。
import userContext._
sc.loadUsers("/user.parquet")
usersRDD.filter(user => namesToFilterOn.contains( user.firstName )).first
代替
val userContext = new UserContext(sc)
userContext.loadUsers("/user.parquet")
usersRDD.filter(user => namesToFilterOn.contains( user.firstName )).first
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.