2016-03-21 8 views
10

मैं स्पार्क में java.time.format से डेटटाइमफॉर्मेटर का उपयोग करने की कोशिश कर रहा हूं लेकिन ऐसा लगता है कि यह क्रमिक नहीं है। इस कोड के प्रासंगिक हिस्सा है:स्पार्क और नहीं सीरियलज़ेबल डेटटाइमफॉर्मर

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 अपवाद कैसे बच सकते हैं? टाइमस्टैम्प पार्स करने के लिए एक बेहतर पुस्तकालय है? मैंने पढ़ा है कि जोडा भी धारावाहिक नहीं है और जावा 8 की टाइम लाइब्रेरी में शामिल किया गया है।

उत्तर

18

आप दो तरह से क्रमबद्धता से बच सकते हैं:

  1. मान लिया जाये कि अपने मूल्य स्थिर हो सकता है, एक object में फ़ॉर्मेटर जगह (यह कर रही है "स्थिर")। इसका मतलब यह होगा कि स्थिर मान यह serializing और कार्यकर्ता के लिए भेजने से ड्राइवर के बजाय, प्रत्येक कार्यकर्ता से पहुंचा जा सकता:

  2. इन्स्तांत यह रिकॉर्ड प्रति गुमनाम समारोह के अंदर। यह कुछ प्रदर्शन जुर्माना किया जाता है (जैसा कि इन्स्टेन्शियशन अधिक से अधिक होगा, रिकॉर्ड के अनुसार) है, इसलिए केवल यह विकल्प यदि पहले लागू नहीं किया जा सकता का उपयोग करें:

    logs.flatMap(fileContent => { 
        val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>") 
        // use formatter here 
    }) 
    
संबंधित मुद्दे