Меня несколько дней смущал этот баг. Я чувствовал, что это могут быть проблемы с датой Java.
Вот код:
val rdd1 = some_rdd1.map { x =>
(x._1, x._2)
}
val rdd2 = some_rdd2.map { x =>
(x._1, x._2)
}
val formatter2 = new SimpleDateFormat("yyyyMMddmmss")
val res_rdd = rdd1.join(rdd2).map { case(id, (tm, value)) =>
val format_time = {
//tm is a unix timestamp, long type
val cur_time = new Date(tm*1000L)
val time_format = formatter2.format(cur_time)
time_format
}
val format_time2 = {
//tm is a unix timestamp, long type
val cur_time = new Date(tm*1000L)
val time_format = formatter2.format(cur_time)
time_format
}
if (format_time!= format_time2) {
println(s"""format_time: ${format_time}, format_time2: ${format_time2}, click_time: ${tm}""")
}
(tm, format_time, format_time2, value)
}
//...
//some actions
Я думал, что format_time
и format_time2
должны быть одинаковыми, поэтому печатные вещи не должны появляться. Однако от исполнителей я получил следующий стандартный вывод:
format_time: 201810251433, format_time2: 201810251241, click_time: 1540442502
format_time: 201810250757, format_time2: 201810250924, click_time: 1540430650
format_time: 201810250738, format_time2: 201810250701, click_time: 1540422067
format_time: 201810251415, format_time2: 201810250738, click_time: 1540448140
format_time: 201810250503, format_time2: 201810251400, click_time: 1540447255
format_time: 201810250831, format_time2: 201810250836, click_time: 1540427797
format_time: 201810251203, format_time2: 201810250901, click_time: 1540429284
format_time: 201810250729, format_time2: 201810250910, click_time: 1540429821
У меня около 14 миллионов данных, и около 60k format_time
и format_time2
не одно и то же. Понятия не имею, почему это происходит?
ой ну спасибо. Почему mapPartitions
может решить такую проблему?
Короче говоря,
SimpleDateFormat
не является потокобезопасным - его нельзя использовать таким образом. Вы должны каждый раз создавать локальный экземпляр потока или использоватьmapPartitions
.