2016-03-21 90 views
10

我想在Spark中使用java.time.format中的DateTimeFormatter,但它似乎是不可序列化的。這是代碼相關的塊:Spark和不可序列化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

可避免序列化有兩種方式:

  1. 假設其值可以是恆定的,放置在object格式化(使它「靜態」)。這意味着,靜態值可以在每個工人中進行訪問,而不是驅動器序列化,併發送給工人:

  2. 初始化它每條記錄匿名函數內部。這帶來的性能損失(如實例化將遍地發生,每個記錄),所以只能用這個選項,如果第一次不能應用於:

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