2012-09-14 33 views
10

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

timestamp user_id page_id action_id 

मैं प्रत्येक पृष्ठ पर उपयोगकर्ता की गिनती के लिए एक Hadoop काम लिखना चाहते हैं, तो आउटपुट फ़ाइल दिखना चाहिए इस तरह:

user_id page_id number_of_actions 

मुझे यहां समग्र कुंजी की तरह कुछ चाहिए - इसमें user_id और page_id होगा। क्या हडूप के साथ ऐसा करने का कोई सामान्य तरीका है? मुझे कुछ भी उपयोगी नहीं मिला। अब तक मैं इस तरह की कुंजी मैपर में उत्सर्जित कर रहा हूं:

context.write(new Text(user_id + "\t" + page_id), one); 

यह काम करता है, लेकिन मुझे लगता है कि यह सबसे अच्छा समाधान नहीं है।

उत्तर

13

बस अपने खुद के Writable लिखें। यहाँ

public class UserPageWritable implements WritableComparable<UserPageWritable> { 

    private String userId; 
    private String pageId; 

    @Override 
    public void readFields(DataInput in) throws IOException { 
    userId = in.readUTF(); 
    pageId = in.readUTF(); 
    } 

    @Override 
    public void write(DataOutput out) throws IOException { 
    out.writeUTF(userId); 
    out.writeUTF(pageId); 
    } 

    @Override 
    public int compareTo(UserPageWritable o) { 
    return ComparisonChain.start().compare(userId, o.userId) 
     .compare(pageId, o.pageId).result(); 
    } 

} 

हालांकि मुझे लगता है कि अपनी आईडी एक long हो सकता है, तो आप String संस्करण है: अपने उदाहरण में एक समाधान ऐसा दिखाई दे सकता। मूल रूप से Writable इंटरफ़ेस पर सामान्य क्रमिकरण, ध्यान दें कि इसे डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता है ताकि आपको हमेशा एक प्रदान करना चाहिए।

compareTo तर्क स्पष्ट रूप से डेटासेट को सॉर्ट करने का तरीका बताता है और यह भी बताता है कि कौन से तत्व बराबर हैं ताकि उन्हें समूहीकृत किया जा सके।

ComparisionChainGuava का अच्छा उपयोग है।

बराबर और हैशकोड को ओवरराइड करना न भूलें! विभाजनकर्ता कुंजी के हैशकोड द्वारा reducer निर्धारित करेगा।

+0

तुलनात्मकता वास्तव में इस उपयोग के मामले के लिए आसान बनाता है। धन्यवाद –

1

आप अपनी खुद की कक्षा लिख ​​सकते हैं जो लिखने योग्य और लिखने योग्य है जो आपके दो क्षेत्रों की तुलना करेगा।

पियरे ल्यूक बर्ट्रेंड