Spark中的NotSerializableException

时间:2018-03-19 11:48:41

标签: scala apache-spark rdd serializable

在线的大多数非序列化问题都将非常基本的数据作为其sc.parallelize()的输入,并且在地图部分中他们遇到了不可序列化的问题,但我的是一种类型。我有一个特定的数据类型,它来自第三方库,不可序列化。 所以写这个显示NotSerializableException:

val data: RDD[ThirdPartyLib.models.XData] = sc.parallelize(ThirdPartyLib.getX)

data.foreachPartition(rows => {
  rows.foreach(row => {
    println("value: " + row.getValue)    
  })  
})

作为一个解决方案,我在内部创建了相同的模型类(XData),但使其可序列化并执行了此操作:

val data: RDD[XData] = (sc.parallelize(ThirdPartyLib.getX)).asInstanceOf[RDD[XData]]

data.foreachPartition(rows => {
  rows.foreach(row => {
    println("value: " + row.getValue)    
  })  
})

我期待问题得到解决,但我仍然遇到与[ERROR] org.apache.spark.util.Utils logError - Exception encountered java.io.NotSerializableException: ThirdPartyLib.models.XData相同的错误。在创建内部可序列化类型时,难道不能解决问题吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

所以用

(sc.parallelize(ThirdPartyLib.getX)).asInstanceOf[RDD[XData]]

首先进行并行化,然后进行投射。所以spark仍然需要ThirdPartyLib.models.XData可序列化。此类演员也可能爆炸,因为类型不一样。

我认为这应该可以解决问题

def convertThirdPartyXDataToMyXData( xd: ThirdPartyLib.models.XData): XData = ???

val data: RDD[ThirdPartyLib.models.XData] = sc.parallelize(ThirdPartyLib.getX.map(convertThirdPartyXDataToMyXData)) //if you have a map on the collection that getX returns