Ошибка даты Java в Spark rdd handle

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

Короче говоря, SimpleDateFormat не является потокобезопасным - его нельзя использовать таким образом. Вы должны каждый раз создавать локальный экземпляр потока или использовать mapPartitions.

zero323 27.10.2018 15:45

ой ну спасибо. Почему mapPartitions может решить такую ​​проблему?

user3162587 28.10.2018 04:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
65
0

Другие вопросы по теме