2016-03-21 11 views
10

Sparkでjava.time.formatからDateTimeFormatterを使用しようとしていますが、シリアル化できないようです。これは、コードの関連チャンクです:Sparkと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 
    }) 
    }) 

どのように私はjava.io.NotSerializableException: java.time.format.DateTimeFormatter例外を回避することができますか?タイムスタンプを解析するためのライブラリがありますか?私はJodaもシリアライズ可能ではなく、Java 8のタイムライブラリに組み込まれていることを読んだ。

答えて

18

次の2つの方法でシリアル化を避けることができます。

  1. その値は(それが「静的」作り)objectにフォーマッタを置き、一定にすることができると仮定。これは、静的な値ではなく、ドライバーがそれをシリアル化し、作業者に送信するのでは、各ワーカー内でアクセスできることを意味する:

  2. 匿名関数内のレコードごとに、それをインスタンス化します。

    logs.flatMap(fileContent => { 
        val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>") 
        // use formatter here 
    }) 
    
:これには、初回のみが適用できない場合は、このオプションを使用し、(インスタンス化がレコードごとに、何度も起こるように)いくつかのパフォーマンスのペナルティを運びます