2015-06-25 18 views
7

पास करना मुझे उत्सुकता है कि स्पार्क में एक समारोह में आरडीडी को वास्तव में क्या करना है।स्पार्क/स्कैला: आरडीडी को फंक्शन

def my_func(x : RDD[String]) : RDD[String] = { 
    do_something_here 
} 

मान लीजिए कि हम उपर्युक्त कार्य को परिभाषित करते हैं। जब हम फ़ंक्शन को कॉल करते हैं और इनपुट पैरामीटर के रूप में मौजूदा आरडीडी [स्ट्रिंग] ऑब्जेक्ट पास करते हैं, तो क्या यह my_function फ़ंक्शन पैरामीटर के रूप में इस RDD के लिए "प्रतिलिपि" बनाता है? दूसरे शब्दों में, क्या इसे संदर्भ-दर-संदर्भ या कॉल-बाय-वैल्यू कहा जा रहा है?

उत्तर

12

स्कैला में कुछ भी कॉपी नहीं हुआ है (पास-दर-मूल्य में आपके पास सी/सी ++ में है) जब पास हो गया। इंट, स्ट्रिंग, डबल इत्यादि के अधिकांश मूल प्रकार अपरिवर्तनीय हैं, इसलिए संदर्भ द्वारा उन्हें पास करना बहुत सुरक्षित है। (नोट: यदि आप एक म्यूटेबल ऑब्जेक्ट पास कर रहे हैं और आप इसे बदलते हैं, तो उस ऑब्जेक्ट के संदर्भ वाले किसी भी व्यक्ति को परिवर्तन दिखाई देगा)।

उस पर, आरडीडी आलसी, वितरित, अपरिवर्तनीय संग्रह हैं। कार्यों के माध्यम से आरडीडी पास करना और transformation उन्हें लागू करना (मानचित्र, फ़िल्टर इत्यादि) वास्तव में किसी भी डेटा को स्थानांतरित नहीं करता है या किसी भी गणना को ट्रिगर नहीं करता है।

सभी श्रृंखलित परिवर्तनों "याद" कर रहे हैं और स्वचालित रूप से सही क्रम में शुरू हो रहा प्राप्त करेंगे जब आप लागू करने और action RDD पर, इस तरह के यह बने, या ड्राइवर पर स्थानीय स्तर पर यह संग्रह (collect() के माध्यम से, take(n), आदि) के रूप में

4

स्पार्क कोड को डेटा भेजने के बजाय "डेटा को" पर कोड भेजता है। तो यहां यह काफी विपरीत होगा। यह वह कार्य है जिसे वितरित किया जाएगा और आरडीडी को भेजा जाएगा।

आरडीडी अपरिवर्तनीय हैं, इसलिए आपका कार्य परिणाम (परिवर्तन) के रूप में एक नया आरडीडी बनाएगा या कुछ मूल्य (क्रिया) बनाएगा।

दिलचस्प सवाल यह है कि, यदि आप कोई फ़ंक्शन परिभाषित करते हैं, तो आरडीडी को वास्तव में क्या भेजा जाता है (और विभिन्न नोड्स के बीच वितरित किया जाता है, इसकी स्थानांतरण लागत के साथ)? यहां एक अच्छी व्याख्या:

http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark

संबंधित मुद्दे