2016-03-21 8 views
10

Ich versuche, das DateTimeFormatter von java.time.format in Spark zu verwenden, aber es scheint nicht serialisierbar zu sein. Dies ist der relevante Teil des Codes:Spark und nicht serialisierbar 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 
    }) 
    }) 

Wie kann ich die java.io.NotSerializableException: java.time.format.DateTimeFormatter Ausnahme vermeiden? Gibt es eine bessere Bibliothek zum Analysieren von Zeitstempeln? Ich habe gelesen, dass Joda auch nicht serialisierbar ist und in die Zeitbibliothek von Java 8 aufgenommen wurde.

Antwort

18

Sie können Serialisierung auf zwei Arten umgehen:

  1. Unter der Annahme, sein Wert konstant sein kann, legen Sie den Formatierer in einem object (so dass es „statisch“). Dies würde bedeuten, dass der statische Wert kann innerhalb jeder Arbeiter zugegriffen werden kann, anstelle des Treibers es Serialisierung und das Senden an Arbeitnehmer:

  2. instantiate es pro Datensatz in der anonymen Funktion. Dies trägt eine Leistungseinbuße (wie die Instanziierung immer passieren wird, pro Datensatz), so dass nur diese Option verwenden, wenn die erste nicht angewendet werden kann:

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