2016-01-26 8 views
5

मैं Google क्लाउड डेटाफ़्लो का उपयोग करने के लिए बहुत नया हूं। मैं दो पीसीओलेक्शन के कार्टेशियन उत्पाद प्राप्त करना चाहता हूं। उदाहरण के लिए, यदि मेरे पास दो पीसीलेक्शंस (1, 2) और ("hello", "world") हैं, तो उनके कार्टेशियन उत्पाद ((1, "hello"), (1, "world"), (2, "hello"), (2, "world")) हैं।दो पीसीओलेक्शंस के कार्टेशियन उत्पाद को कैसे प्राप्त करें

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

धन्यवाद!

+0

क्या आपके पास क्या करने की कोशिश कर रहे हैं, इसके बारे में कोई और जानकारी है? प्रत्येक पीसीओलेक्शन कितने बड़े हैं? इसे पूरा करने के कई तरीके हैं, और कौन सा बेहतर है, इस कारण पर निर्भर करता है कि आप कार्टशियन उत्पाद और वास्तविक पीसीओलेक्शन शामिल करना चाहते हैं। –

+0

दो पीसीओलेक्शन समान हैं। दोनों में लगभग 100,000 tuples प्रकार '(स्ट्रिंग, स्ट्रिंग)' होते हैं। मैं अंग्रेजी शब्दों का एक शब्दकोश का उपयोग कर रहा हूं और 2-शब्द पन उत्पन्न करने के लिए अपने ध्वन्यात्मक प्रतिलेखन प्राप्त कर रहा हूं, जैसे: "fantasti-CAL-ifornia"। –

+0

प्रत्यक्ष कार्टशियन समाधान के लिए, [यह] (http://stackoverflow.com/a/41051283/377366) अब के लिए उपलब्ध सबसे अच्छा उत्तर प्रतीत होता है। – KobeJohn

उत्तर

3

सामान्यतः, कार्टशियन उत्पाद की गणना महंगा होगी। यदि संग्रह के दोनों (या दोनों) स्मृति में फिट होते हैं, तो आप सभी श्रमिकों को डेटा प्रसारित करने के लिए side-inputs का उपयोग कर सकते हैं। तो आपके उदाहरण के लिए, आप PCollection<String> को एक साइड इनपुट में बदल देंगे, और फिर आपके पास ParDo होगा जो इसे मुख्य इनपुट के रूप में ले जाएगा। मुख्य इनपुट पर प्रत्येक स्ट्रिंग के लिए, आप साइड-इनपुट तक पहुंच सकते हैं जिसमें सभी मानों का Iterable<String> था, और आप जोड़े को आउटपुट करेंगे (या आप इस DoFn में केवल लाइन जोड़े को आउटपुट करना चुन सकते हैं)।

यह हर बार शब्दों के पूरे सेट पर दोबारा शुरू होगा - अगर यह स्मृति में फिट बैठता है तो यह ठीक होना चाहिए। यदि इसे हर बार समस्या इनपुट डेटा फिर से प्राप्त करना होता है तो यह समस्याग्रस्त हो सकता है।

एक और दृष्टिकोण शफलिंग और चाबियों पर भरोसा करना होगा। मान लें कि आप 3-अक्षर ओवरलैप वाले शब्दों को ढूंढना चाहते हैं। आप शब्दकोश को संसाधित कर सकते हैं और 3-अक्षर उपसर्गों द्वारा की गई मानों के PCollection का उत्पादन कर सकते हैं। आप 3-अक्षर प्रत्यय द्वारा की गई PCollection भी बना सकते हैं। फिर आप GroupByKey (या CoGroupByKey) कर सकते हैं। इसके बाद, आपके पास प्रत्येक 3-अक्षर कुंजी के लिए, सभी शब्द एक उपसर्ग के रूप में और एक प्रत्यय के रूप में है।

+0

इनपुट के लिए धन्यवाद! मैं शायद 'ग्रुपबीकी' विधि के साथ जाऊंगा! –

+3

यह वास्तव में कार्टेशियन उत्पाद को कैसे करें, इस सवाल का जवाब नहीं देता है। – Max

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