2014-05-19 3 views
6

में नेस्टेड विधि के साथ "कार्य क्रमबद्ध नहीं करें" से बचें, मैं सामान्य "टास्क सीरियलज़ेबल" समस्या को समझता हूं जो किसी फ़ील्ड तक पहुंचने या बंद होने के दायरे से बाहर होने वाली विधि को उत्पन्न करता है।कक्षा

इसे ठीक करने के लिए, मैं आमतौर पर इन क्षेत्रों/तरीकों की एक स्थानीय प्रति है, जो पूरी कक्षा को क्रमानुसार करने की जरूरत से बचा जाता है परिभाषित: अब

class MyClass(val myField: Any) { 
    def run() = { 
    val f = sc.textFile("hdfs://xxx.xxx.xxx.xxx/file.csv") 

    val myField = this.myField 
    println(f.map(_ + myField).count) 
    } 
} 

, अगर मैं रन विधि में एक नेस्टेड समारोह को परिभाषित, यह धारावाहिक नहीं किया जा सकता:

class MyClass() { 
    def run() = { 
    val f = sc.textFile("hdfs://xxx.xxx.xxx.xxx/file.csv") 

    def mapFn(line: String) = line.split(";") 

    val myField = this.myField 
    println(f.map(mapFn(_)).count) 

    } 
} 

मुझे समझ नहीं आता के बाद से मैंने सोचा था कि "mapFn" दायरे में होगा ... भी अजनबी, अगर मैं परिभाषित mapFn एक डीईएफ़ के बजाय एक वैल हो सकता है, तो यह काम करता है :

class MyClass() { 
    def run() = { 
    val f = sc.textFile("hdfs://xxx.xxx.xxx.xxx/file.csv") 

    val mapFn = (line: String) => line.split(";") 

    println(f.map(mapFn(_)).count)  
    } 
} 

क्या यह स्कैला नेस्टेड कार्यों का प्रतिनिधित्व करने के तरीके से संबंधित है?

इस मुद्दे से निपटने के लिए अनुशंसित तरीका क्या है? नेस्टेड कार्यों से बचें?

+0

मैं इसे भी देख रहा हूं, एक बार जब वे वैल में बदल जाते हैं तो यह काम करता है! तो इस अवलोकन को साझा करने के लिए धन्यवाद। – MahdeTo

उत्तर

1

क्या यह इस तरह से काम नहीं कर रहा है ताकि पहले मामले में f.map(mapFN(_))f.map(new Function() { override def apply(...) = mapFN(...) }) के बराबर है और दूसरे में यह केवल f.map(mapFN) है? जब आप def के साथ कोई विधि घोषित करते हैं तो यह शायद कुछ अज्ञात वर्ग में केवल एक विधि है जिसमें संलग्न कक्षा के संदर्भ में $outer अंतर्निहित है। लेकिन map को Function की आवश्यकता है ताकि संकलक को इसे लपेटने की आवश्यकता हो। रैपर में आप उस अज्ञात वर्ग की कुछ विधि का संदर्भ लें, लेकिन उदाहरण के लिए नहीं। यदि आप val का उपयोग करते हैं, तो आपके पास उस कार्य का प्रत्यक्ष संदर्भ है जिसे आप map पर भेजते हैं। मुझे इस बारे में निश्चित नहीं है, बस जोर से सोच रहा है ...