Я столкнулся с чем-то странным в 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, похоже, он получает необходимые поля от конструктора.Я предполагаю, что предполагал, что он будет использовать эти кодировщики для такого рода вещей.
Я даже декомпилировал файл класса моего case-класса, и сгенерированный конструктор кажется разумным.