gpt4 book ai didi

java - Spark 和不可序列化的 DateTimeFormatter

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:14 28 4
gpt4 key购买 nike

我正在尝试在 Spark 中使用 java.time.format 中的 DateTimeFormatter,但它似乎不可序列化。这是相关的代码块:

val pattern = "<some pattern>".r
val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>")

val logs = sc.wholeTextFiles(path)

val entries = logs.flatMap(fileContent => {
val file = fileContent._1
val content = fileContent._2
content.split("\\r?\\n").map(line => line match {
case pattern(dt, ev, seq) => Some(LogEntry(LocalDateTime.parse(dt, dtFormatter), ev, seq.toInt))
case _ => logger.error(s"Cannot parse $file: $line"); None
})
})

如何避免 java.io.NotSerializableException: java.time.format.DateTimeFormatter 异常?有没有更好的库来解析时间戳?我读到 Joda 也是不可序列化的,并且已被合并到 Java 8 的时间库中。

最佳答案

您可以通过两种方式避免序列化:

  1. 假设它的值可以是常量,将格式化程序放在一个对象中(使其成为“静态的”)。这意味着可以在每个工作人员中访问静态值,而不是驱动程序将其序列化并发送给工作人员:

    object MyUtils {
    val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>")
    }

    import MyUtils._
    logs.flatMap(fileContent => {
    // can safely use formatter here
    })
  2. 在匿名函数中根据记录实例化它。这会带来一些性能损失(因为实例化会一遍又一遍地发生,每条记录),所以只有在无法应用第一个选项时才使用此选项:

    logs.flatMap(fileContent => {
    val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>")
    // use formatter here
    })

关于java - Spark 和不可序列化的 DateTimeFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132451/

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