2015-05-27 5 views
5

के रूप में उपयोग करते हुए मुझे पता है कि टैब क्षेत्रों के लिए डिफ़ॉल्ट इनपुट विभाजक है:Hadoop 2.4.0 स्ट्रीमिंग सामान्य पार्सर विकल्प टैब विभाजक

stream.map.output.field.separator=\t (or) 
stream.map.output.field.separator="\t" 
:

stream.map.output.field.separator 
stream.reduce.input.field.separator 
stream.reduce.output.field.separator 
mapreduce.textoutputformat.separator 

लेकिन अगर मैं सामान्य पार्सर विकल्प लिखने की कोशिश

यह जांचने के लिए कि कैसे हडूप अलग-अलग स्पेस वर्णों को "\ t, \ n, \ f" जैसे विभाजक के रूप में उपयोग किया जाता है। मैंने देखा कि हैडोप इसे \ t चरित्र के रूप में पढ़ता है लेकिन "" टैब स्पेस नहीं है। मैं कम करने (अजगर) में प्रत्येक पंक्ति मुद्रण द्वारा यह जाँच के रूप में उपयोग में लिखा है: print (key,value1,value2,sep='\t',end='\n') आदेश का उपयोग key value1 value2

:

sys.stdout.write(str(line)) 

मेरे नक्शाकार के रूप में कुंजी/मान जोड़े उत्सर्जन करता है।

तो मैं अपने कम करने की उम्मीद के रूप में प्रत्येक पंक्ति को पढ़ने के लिए: बहुत key value1 value2, लेकिन इसके बजाय sys.stdout.write(str(line)) मुद्रित:

key value1 value2 \\with trailing space

Hadoop streaming - remove trailing tab from reducer output से, मैं समझ गया अनुगामी अंतरिक्ष की वजह से mapreduce.textoutputformat.separator नहीं की स्थापना की और छोड़ दिया जा रहा है कि जैसे अकरण।

key value1 value2

कुंजी और खाली पाठ वस्तु के बाद से यह बजाय "\ t" चरित्र के रूप में stream.map.output.field.separator=\t से विभाजक पढ़ के रूप में मूल्य के रूप में

:

तो, यह मेरी धारणा है कि मेरी कुल नक्शा उत्पादन माना Hadoop की पुष्टि की "" टैब स्पेस स्वयं।

कृपया मुझे इस व्यवहार को समझने में सहायता करें और यदि मैं चाहूं तो एक विभाजक के रूप में मैं \ t का उपयोग कैसे कर सकता हूं।

उत्तर

0

आपको यह समस्या हो सकती है "-D stream.map.output.field.separator =।" निर्दिष्ट करता है "।" नक्शा आउटपुट के लिए क्षेत्र विभाजक के रूप में, और चौथाई तक उपसर्ग "।" एक पंक्ति में कुंजी और शेष रेखा होगी (चौथा "।" को छोड़कर) मूल्य होगा। यदि किसी पंक्ति में चार से कम "" है, तो पूरी पंक्ति कुंजी होगी और मान एक खाली टेक्स्ट ऑब्जेक्ट होगा (जैसा कि नए टेक्स्ट ("") द्वारा बनाया गया है)।Here यह स्पष्ट रूप से बताया गया है कि विभाजक का उपयोग कैसे किया जा रहा है, और मानचित्र कुंजी और मूल्य की पहचान करते समय इस तरह के विभाजक अवसरों पर विचार करने की आवश्यकता है। इसके अलावा विभाजन से संबंधित क्षेत्र भी हैं, जिनके आधार पर reducer को संभाला जाएगा। जैसा कि आप विभाजक को बदलना चाहते हैं, मुझे लगता है कि आपको इसे विभाजन और reducer से भी सत्यापित करना होगा।

+0

मैं अपने तर्क में कोई फ़ील्ड नंबर नहीं दे रहा हूं और AFAI समझ गया है, आपके द्वारा उल्लिखित समस्या केवल तब उत्पन्न होती है जब मैं फ़ील्ड नंबर प्रदान करता हूं और यदि मैं अपने इच्छित फ़ील्ड नंबर से कम देता हूं। मैं "विभाजन से संबंधित फ़ील्ड" के बारे में हिस्सा नहीं समझ पाया। हालांकि मैं "पाइपमैपर.जावा" में दिलचस्प रूप से हैडोप 2.4.0 स्रोत कोड को डिबग कर रहा था: लाइन 'mapOutputFieldSeparator = job.get ("stream.map.output.field.separator", "\ t")। GetBytes ("यूटीएफ -8"); जब मैं तर्क के बिना 'stream.map.output.field.separator = \ t' तर्क के रूप में' tAB' (सफेद वर्ण) देता हूं तो 'आउटपुट 't' omitting \ character आउटपुट करता है। – annunarcist

+0

नौकरी जावा कोड में, "\ t" के पैरामीटर "stream.map.output.field.separator" मान को जोड़ने का प्रयास करें। यह सुनिश्चित नहीं है कि इसे क्यों उठाया जा रहा है, जहां – Ramzy

+0

यह एक स्ट्रीमिंग नौकरी है। हम केवल स्क्रिप्ट/एक्जिक्यूटिव के रूप में मैपर/रेड्यूसर पास कर सकते हैं और मैं अपने मैपर और रेड्यूसर के लिए पाइथन स्क्रिप्ट का उपयोग कर रहा हूं।हम यहां जॉब ऑब्जेक्ट तक नहीं पहुंच सकते हैं। – annunarcist

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