2016-03-21 28 views
10

DateTimeFormatter'ı Spark içinde java.time.format kaynağında kullanmaya çalışıyorum ancak seri hale getirilemez gibi görünüyor. Bu kodun ilgili yığınıdır:Spark ve Serializable 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 
    }) 
    }) 
Ben java.io.NotSerializableException: java.time.format.DateTimeFormatter istisna önleyebilirsiniz nasıl

? Zaman damgalarını ayrıştırmak için daha iyi bir kütüphane var mı? Joda'nın da seri hale getirilemediğini ve Java 8'in zaman kitaplığına dahil olduğunu okudum.

cevap

18

iki şekilde seri önleyebilirsiniz:

  1. varsayarsak değeri sabit olabilen bir object yılında formatlayıcıyı koyuyoruz (bu yapım "statik"). Bu statik değer seri hale ve işçiye gönderilmesi yerine sürücünün, her işçi içinde ulaşılabilir anlamına gelir: anonim işlevi içinde kayıt başına

  2. örneğini onu.

    logs.flatMap(fileContent => { 
        val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>") 
        // use formatter here 
    }) 
    
: Bu yüzden sadece ilk uygulanamaz, bu seçeneği kullanın (örnekleme kayıt başına, tekrar tekrar olacak şekilde) bazı performans ceza taşır