2011-01-20 7 views
16

क्या कोई नक्शा कम करने की अवधारणा को समझा सकता है, खासकर मोंगो में?क्या कोई व्यक्ति सी # में मानचित्र-कमी को समझा सकता है?

मैं सी # का भी उपयोग करता हूं इसलिए उस क्षेत्र में कोई भी विनिर्देश उपयोगी भी होगा।

+0

आईएमएचओ, सबसे अच्छा जवाब यहां है। अंतिम नमूना रूबी में है। [केली बैंकर का ब्लॉग - मोंगो डीबी कर्मचारी - resp। रूबी ड्राइवर के लिए] (http://kylebanker.com/blog/2009/12/mongodb-map-reduce-basics/) –

उत्तर

2

मानचित्र घटाएं डेटा को संसाधित करने का एक तरीका है जहां आपके पास नक्शा चरण/फ़ंक्शन है जो सभी डेटा को संसाधित और संसाधित करने के लिए पहचानता है, पंक्ति द्वारा पंक्ति।

फिर आपके पास एक कम चरण/फ़ंक्शन है जिसे कई बार चलाया जा सकता है, उदाहरण के लिए एक बार क्लस्टर में प्रति सर्वर और फिर ग्राहक में अंतिम परिणाम लौटने के लिए।

यहाँ एक विकी लेख और अधिक विस्तार में यह वर्णन किया गया है: MapReduce के लिए MongoDB के लिए दस्तावेज़

http://en.wikipedia.org/wiki/MapReduce

और यहाँ है

http://www.mongodb.org/display/DOCS/MapReduce

सरल उदाहरण के लिए, में सबसे लंबे समय स्ट्रिंग लगता है एक सूचि।

नक्शा चरण प्रत्येक स्ट्रिंग की लंबाई की गणना करने वाली सूची में लूप होगा, नक्शा से नतीजे पर कम कदम लूप होगा और प्रत्येक पंक्ति के लिए सबसे लंबा रहता है।

यह कारण अधिक जटिल हो सकता है लेकिन यह इसका सार है।

14

Here's a spot मोंगो में मानचित्र कम करने के साथ शुरू करने के लिए। कुकबुक में कुछ उदाहरण हैं, मैं thesetwo पर ध्यान केंद्रित करूंगा।

मुझे "डेटा वेयरहाउसिंग जॉब्स" या "रोलअप" के संदर्भ में मानचित्र-कमी के बारे में सोचना पसंद है। आप मूल रूप से विस्तृत डेटा ले रहे हैं और उस डेटा के एक छोटे संस्करण को "रोलिंग" कर रहे हैं।

एसक्यूएल में आप आमतौर पर sum() और avg() और group by के साथ ऐसा करेंगे। मोंगो डीबी में आप इसे मानचित्र कम करने के साथ करेंगे। मानचित्र कम करने का मूल आधार यह है कि आपके पास दो कार्य हैं।

पहले समारोह (नक्शा) एक मूल रूप से एक विशाल for पाश कि अपने डेटा पर चलाता है और "का उत्सर्जन करता है" कुछ कुंजी और मूल्यों है। दूसरा फ़ंक्शन (कम), उत्सर्जित डेटा पर एक विशाल लूप है। नक्शा कहते हैं "हे इस डेटा आप संक्षेप में प्रस्तुत करना चाहते हैं" और कम करने का कहना है "हे मूल्यों इस एकल मान को कम कर देता है की इस सरणी"

एक से उत्पादन नक्शा-कम करने में आ सकते हैं कई रूपों (आमतौर पर फ्लैट फाइलें)। MongoDB में, आउटपुट वास्तव में एक नया संग्रह है।

सी # सुनिश्चित वर्णन

MongoDB में मानचित्र के सभी javascript इंजन के अंदर प्रदर्शन कर रहे हैं कम करता है। तो मानचित्र & दोनों फ़ंक्शन को जावास्क्रिप्ट में लिखा गया है। विभिन्न ड्राइवर आपको जावास्क्रिप्ट बनाने और कमांड जारी करने की अनुमति देंगे, हालांकि, ऐसा नहीं है कि मैं इसे सामान्य रूप से कैसे करता हूं।

मानचित्र को कम करने के लिए पसंदीदा विधि जेएस को फ़ाइल में संकलित करना है और फिर mongo map_reduce.js है। आम तौर पर आप इसे सर्वर पर क्रॉन जॉब या शेड्यूल किए गए कार्य के रूप में कहीं भी करेंगे।

क्यों?

ठीक है, नक्शा कम करना "वास्तविक समय" नहीं है, खासकर एक बड़े डेटा सेट के साथ। यह वास्तव में एक बैच फैशन में इस्तेमाल करने के लिए डिज़ाइन किया गया है। मुझे गलत मत समझो, आप इसे अपने कोड से कॉल कर सकते हैं, लेकिन आम तौर पर, आप नहीं चाहते हैं कि उपयोगकर्ता मानचित्र को कम करने के लिए मानचित्र शुरू करें। इसके बजाय आप उन नौकरियों शेड्यूल किए जाने वाले और आप उन परिणामों :) समझने के लिए सी # से आ रही मानचित्र-कम

27

एक तरह से क्वेरी करने बनना चाहता हूँ और LINQ एक SelectMany() एक GroupBy() के बाद एक के बाद के रूप में यह सोचने के लिए है चाहता हूँ Aggregate() ऑपरेशन।

SelectMany() में आप एक अनुक्रम पेश कर रहे हैं लेकिन प्रत्येक तत्व एकाधिक तत्व बन सकता है। यह आपके मानचित्र संचालन में एकाधिक emit विवरणों का उपयोग करने के बराबर है। नक्शा ऑपरेशन भी उत्सर्जित नहीं करना चुन सकता है जो आपके SelectMany() ऑपरेशन के अंदर Where() खंड होने जैसा है।

GroupBy() में आप एक ही कुंजी के साथ तत्व एकत्र कर रहे हैं जो कि मानचित्र ऑपरेशन से निकलने वाले महत्वपूर्ण मूल्य के साथ मैप-रेड्यूस करता है।

Aggregate() या चरण को कम करें आप प्रत्येक समूह कुंजी से जुड़े संग्रह ले रहे हैं और प्रत्येक कुंजी के लिए एक परिणाम उत्पन्न करने के लिए उन्हें किसी तरह से संयोजित कर रहे हैं। अक्सर यह संयोजन मानचित्र कुंजी से प्रत्येक कुंजी के साथ एक '1' मान आउटपुट जोड़ रहा है लेकिन कभी-कभी यह अधिक जटिल होता है।

मोंगोडीबी के मानचित्र-कम के साथ एक महत्वपूर्ण चेतावनी यह है कि कम करने के संचालन को उसी डेटा प्रकार को स्वीकार करना और आउटपुट करना चाहिए क्योंकि इसे समूहीकृत समूह के आंशिक सेट पर बार-बार लागू किया जा सकता है। यदि आप मूल्यों की एक सरणी पारित कर चुके हैं, तो बस इसकी लंबाई न लें क्योंकि यह पहले के कम ऑपरेशन से आंशिक परिणाम हो सकता है।

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