Serialization 从avro架构生成的类的Spark问题

Serialization 从avro架构生成的类的Spark问题,serialization,apache-spark,avro,Serialization,Apache Spark,Avro,我有一段用spark编写的代码,它将HDFS中的数据加载到由AVROIDL生成的java类中。在以这种方式创建的RDD上,我正在执行简单的操作,其结果取决于我是否在RDD之前缓存它 i、 如果我运行下面的代码 val loadedData = loadFromHDFS[Data](path,...) println(loadedData.map(x => x.getUserId + x.getDate).distinct().count()) // 200000 程序将打印200000,

我有一段用spark编写的代码,它将HDFS中的数据加载到由AVROIDL生成的java类中。在以这种方式创建的RDD上,我正在执行简单的操作,其结果取决于我是否在RDD之前缓存它 i、 如果我运行下面的代码

val loadedData = loadFromHDFS[Data](path,...)
println(loadedData.map(x => x.getUserId + x.getDate).distinct().count()) // 200000
程序将打印200000,另一方面执行下一个代码

val loadedData = loadFromHDFS[Data](path,...).cache()
println(loadedData.map(x => x.getUserId + x.getDate).distinct().count()) // 1
结果1打印到标准输出

当我在读取缓存数据后检查字段值时,似乎

我很确定,所描述的问题的根本原因是AVROIDL生成的类的序列化问题,但我不知道如何解决它。我尝试使用Kryo,注册生成的类(数据),从chill_avro为给定的类注册不同的序列化程序(SpecificRecordSerializer、SpecificRecordBinarySerializer等),但这些想法对我都没有帮助

我怎样才能解决这个问题


尽量减少、完整和可验证的示例。

尝试下面的代码-

val loadedData = loadFromHDFS[Data](path,...)
println(loadedData.map(x => x.getUserId + x.getDate).distinct().count()).cache()

请尝试下面的代码-

val loadedData = loadFromHDFS[Data](path,...)
println(loadedData.map(x => x.getUserId + x.getDate).distinct().count()).cache()

我遇到了同样的问题。你知道更多关于它的事了吗?这是一个已知的问题吗?如果没有,也许应该向Spark?报告,以使其工作,您需要创建加载数据的深度副本,即
loadFromHDFS[data](路径,…).map(data.newBuilder(u).build()).cache()
将完成我遇到的相同问题。你知道更多关于它的事了吗?这是一个已知的问题吗?如果没有,也许应该向Spark?报告,以便使其工作,您需要创建加载数据的深度副本,即
loadFromHDFS[data](路径,…).map(data.newBuilder(u).build()).cache()