gpt4 book ai didi

scala - Spark 序列化如何为案例类工作?

转载 作者:行者123 更新时间:2023-12-03 07:32:53 25 4
gpt4 key购买 nike

我在 Spark 2.2 中遇到了一些奇怪的事情,以及它如何反序列化案例类。对于这些示例,假设这个案例类:

case class X(a:Int, b:Int) {
println("in the constructor!!!")
}

如果我有以下映射操作,我会在执行器日志中看到我的构造函数和“a”消息的值。
ds.map(x => {
val x = X(1, 2)
println(s"a=${x.a})
}

通过以下映射操作,我没有看到我的构造函数消息,但我确实在执行程序日志中看到了“a”消息的值。构造函数消息在驱动程序日志中。
val x = X(1, 2)
ds.map(x => println(s"a=${x.a}"))

如果我使用广播变量,我会得到相同的行为。
val xBcast = sc.broadcast(X(1, 2))
ds.map(x => println(s"a=${xBcast.value.a}"))

知道发生了什么吗? Spark 是否根据需要序列化每个字段?我原以为整个对象都会被运过来并反序列化。通过反序列化,我希望有一个构造函数调用。

当我查看 Products 的编码器代码时,它似乎从构造函数中获取了必要的字段。我想我假设它会使用这些编码器来处理这种事情。

我什至反编译了我的案例类的类文件,生成的构造函数看起来很合理。

最佳答案

Spark 默认使用 Java 序列化(可用,因为 case 类扩展 Serializable ),不需要使用构造函数来反序列化。见 this StackOverflow question for details on Java serialization/deserialization .

请注意,这种对 Java 序列化的依赖可能会导致问题,因为内部序列化格式不是一成不变的,因此 JVM 版本差异可能会导致反序列化失败。

关于scala - Spark 序列化如何为案例类工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52725474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com