2015-09-12 8 views
6

यह देखते हुए कि HashPartitioner डॉक्स कहते हैं:स्पार्क में कुंजी द्वारा विभाजन कैसे करें?

[HashPartitioner] को लागू करता है हैश आधारित जावा के Object.hashCode का उपयोग कर विभाजन।

मैं अपने kind द्वारा DeviceData विभाजन करना चाहते हैं।

case class DeviceData(kind: String, time: Long, data: String) 

यह deviceData.hashCode() विधि ओवरराइट करके एक RDD[DeviceData] विभाजन और केवल kind की hashCode उपयोग करने के लिए सही होगा?

लेकिन यह देखते हुए कि HashPartitioner कई विभाजन पैरामीटर लेता है, मैं इस बात से उलझन में हूं कि मुझे अग्रिम प्रकार की संख्या जानने की आवश्यकता है और क्या होता है यदि विभाजन से अधिक प्रकार हैं?

यह सही जब पढ़ा है कि अगर मैं डिस्क में विभाजित डेटा लिखने यह विभाजित रहेगी है?

मेरा लक्ष्य

deviceDataRdd.foreachPartition(d: Iterator[DeviceData] => ...) 

फोन और इटरेटर में एक ही kind मूल्य का केवल DeviceData की है।

उत्तर

7

कैसे सिर्फ एक groupByKey कर kind उपयोग के बारे में। या कोई अन्य PairRDDFunctions विधि।

आप यह मेरे लिए लग रहे हैं कि तुम सच में, विभाजन के बारे में परवाह नहीं है सिर्फ इतना है कि आप एक प्रसंस्करण प्रवाह में एक विशेष प्रकार के सभी मिलता है?

जोड़ी कार्यों यह अनुमति देते हैं:

rdd.keyBy(_.kind).reduceByKey(....) 

या mapValues या अन्य जोड़ी कार्यों कि गारंटी के एक नंबर:

rdd.keyBy(_.kind).partitionBy(new HashPartitioner(PARTITIONS)) 
    .foreachPartition(...) 

लेकिन, आप शायद और अधिक की तरह कुछ के साथ एक छोटे से सुरक्षित किया जा सकता है आपको पूरे

5

के रूप में टुकड़े मिलते हैं क्या यह आरडीडी [डिवाइसडाटा] को ओवी द्वारा विभाजित करना सही होगा डिवाइस Data.hashCode() विधि को erwriting और केवल प्रकार के हैशकोड का उपयोग करें?

यह नहीं होगा। आप जावा Object.hashCode प्रलेखन पर ले, तो आप hashCode के सामान्य अनुबंध के बारे में निम्न जानकारी प्राप्त होगी:

दो वस्तुओं बराबरी के अनुसार बराबर हैं (वस्तु) विधि है, तो बुला में से प्रत्येक पर hashCode विधि दो वस्तुओं को एक ही पूर्णांक परिणाम उत्पन्न करना चाहिए।

तो जब तक समानता की धारणा डिवाइस का एक kind पर विशुद्ध रूप से आधारित आपके उपयोग के मामले फिट बैठता है, और मैं गंभीरता से संदेह यह होता है, HashCode को संवारता वांछित विभाजन एक बुरा विचार है पाने के लिए। सामान्य मामले में आप implement your own partitioner लेकिन यहाँ यह आवश्यक नहीं है चाहिए।

के बाद से, एसक्यूएल और GraphX ​​में विशेष स्थितियों को छोड़कर, partitionBy वैध केवल PairRDD पर है यह भावना RDD[(String, DeviceData)] बना सकते हैं और बस ध्यान रखें कि एक स्थिति है जहाँ kind कम प्रमुखता है में उपयोग सादे HashPartitioner

deviceDataRdd.map(dev => (dev.kind, dev)).partitionBy(new HashPartitioner(n)) 

के लिए बनाता है या विभाजन के लिए इसका उपयोग कर अत्यधिक skewed वितरण एक इष्टतम समाधान नहीं हो सकता है।

+0

अच्छा बिंदु। ऑब्जेक्ट्स बराबर बीसी नहीं होनी चाहिए, उनके समान ही हैं। – BAR

+4

सं। यहां एक तार्किक झूठ है -> "जब तक किसी प्रकार की डिवाइस पर समानता के आधार पर समानता की धारणा आपके उपयोग के मामले में फिट नहीं होती है, और मुझे गंभीरता से संदेह होता है, वांछित विभाजन प्राप्त करने के लिए हैशकोड के साथ टंकण करना एक बुरा विचार है" हैशकोड इस तरह के आधार पर यह नहीं दर्शाता है कि समानता पूरी तरह से प्रकार पर आधारित है। बस, * अगर * 2 रिकॉर्ड समान हैं, तो उनके पास समान प्रकार है, और यह आसानी से संतुष्ट है। –

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