2012-03-15 12 views
5

मैं पाठ फ़ाइलों में विशिष्ट उपयोगकर्ताओं के लिए टाइमस्टैंप मान हो कहो,Hadoop में पाठ से CustomWritable पार्स करने के लिए कैसे

#userid; unix-timestamp; value 
1; 2010-01-01 00:00:00; 10 
2; 2010-01-01 00:00:00; 20 
1; 2010-01-01 01:00:00; 11 
2; 2010-01-01 01:00:00, 21 
1; 2010-01-02 00:00:00; 12 
2; 2010-01-02 00:00:00; 22 

जैसे मैं एक कस्टम वर्ग "SessionSummary" readFields और को लागू करने WritableComparable के लिखने है। इसका उद्देश्य प्रत्येक कैलेंडर दिन के लिए प्रति उपयोगकर्ता के सभी मूल्यों को जोड़ना है।

तो नक्शाकार प्रत्येक उपयोगकर्ता के लिए लाइनों के नक्शे, कम करने उपयोगकर्ता प्रति दिन प्रति सभी मूल्यों को सारांशित और आउटपुट TextOutputFormat के रूप में एक SessionSummary (की toString का उपयोग कर SessionSummary, टैब से अलग UTF-8 स्ट्रिंग के रूप में):

1; 2010-01-01; 21 
2; 2010-01-01; 41 
1; 2010-01-02; 12 
2; 2010-01-02; 22 

यदि मुझे दूसरे मानचित्र/चरण को कम करने के लिए इन सारांश-प्रविष्टियों का उपयोग करने की आवश्यकता है, तो सदस्यों को पॉप्युलेट करने के लिए मुझे इस सारांश डेटा को कैसे पार्स करना चाहिए? क्या मैं डेटा इनपुट किसी भी तरह टेक्स्ट स्ट्रिंग का उपयोग कर मौजूदा रीडफिल्ड्स और लिखने के तरीकों का उपयोग कर सकता हूं (लिखने योग्य योग्य इंटरफ़ेस कार्यान्वयन)। यह (जाहिर है) काम नहीं किया:

public void map(...) { 
    SessionSummary ssw = new SessionSummary(); 
    ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8")))); 
} 

सामान्य में: वहाँ है, जबकि मानव पठनीय पाठ रखते हुए, Hadoop में कस्टम कुंजी और मान को लागू करने और उन्हें आसानी से कई एम/आर चरणों में पुन: प्रयोज्य बनाने के लिए एक सबसे अच्छा अभ्यास है प्रत्येक चरण में उत्पादन?

(Hadoop संस्करण है 0.20.2/CDH3u3)

उत्तर

8

अपने पहले एमआर नौकरी के लिए उत्पादन प्रारूप होना चाहिए SequenceFileOutputFormat - यह एक द्विपदीय प्रारूप में कम करने से कुंजी/मान उत्पादन संग्रहीत करेगा कि तो कर सकते हैं SequenceFileInputFormat का उपयोग कर अपने दूसरे एमआर नौकरी में वापस पढ़ा जाए। यह भी सुनिश्चित करें कि पर outputKeyClass और outputValueClass सेट करें।

दूसरे काम में नक्शाकार तो है SessionSummary (और जो कुछ भी मान प्रकार है)

आप पहली बार एमआर नौकरी से शाब्दिक उत्पादन देखने की जरूरत है, तो आप HDFS में उत्पादन फाइलों पर निम्नलिखित चला सकते हैं :

hadoop fs -libjars my-lib.jar -text output-dir/part-r-* 

यह क्रम फ़ाइल की/मान जोड़े में पढ़ सकते हैं और दोनों वस्तुओं पर toString() फोन करेगा, टैब उन्हें अलग करने जब stdout के लिए outputting। -libjars निर्दिष्ट करता है कि हैडऑप आपकी कस्टम कुंजी/वैल्यू कक्षाएं

+1

धन्यवाद क्रिस! तो दूसरी एमआर नौकरी के लिए, मैंने conf.setInputFormat (SequenceFileInputFormat.class) सेट किया है, और मैपर कुंजी और मान वर्ग पहले Reducer के आउटपुट के समान हैं, सही? – thomers

+0

यह सही है। –

+0

मैं दूसरी एमआर नौकरी के लिए मैपर कुंजी और मूल्य वर्गों को स्पष्ट रूप से कैसे सेट करूं? मैं IdentityMapper के साथ परीक्षण कर रहा हूं, और यह टेक्स्ट को कुंजी के रूप में उम्मीद करता है। – thomers

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