在线的大多数非序列化问题都将非常基本的数据作为其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
相同的错误。在创建内部可序列化类型时,难道不能解决问题吗?我该如何解决这个问题?
答案 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