2013-03-31 7 views
8

मेरे नक्शाकार निम्नलिखित tuples भेजने के लिए की जरूरत है भेज सकते हैं:कैसे जावा Hadoop मैपर से अधिक मान

<custID,prodID,rate> 

और मैं एक कुंजी के रूप ग्राहकआईडी कम करने के लिए भेजने के लिए मूल्य prodid और दर के रूप में एक साथ, के रूप में चाहते हैं, और उन्हें कम चरण के लिए जरूरी है। ऐसा करने का सबसे अच्छा तरीका कौन सा है?

public void map(Object key, Text value, Context context) 
     throws IOException, InterruptedException { 

    String[] col = value.toString().split(","); 
    custID.set(col[0]); 
    data.set(col[1] + "," + col[2]); 
    context.write(custID, data); 
} 

public void reduce(Text key, Iterable<Text> values, Context context) 
     throws IOException, InterruptedException { 

    for (Text val : values) { 
     String[] temp = val.toString().split(","); 
     Text rate = new Text(temp[1]); 
     result.set(rate); 
     context.write(key, result); 
    } 
} 
+0

आप कई मूल्य क्यों नहीं भेज सकते हैं? कुंजी-मूल्य जोड़े की संख्या को सीमित करने से कोई भी नक्शा कार्य उत्पन्न नहीं हो सकता है। – kichik

उत्तर

3

सरलतम मैं के बारे में सोच सकते हैं उन्हें एक ही स्ट्रिंग में विलय करने के लिए बस है:

output.collect(custID, prodID + "," + rate); 

फिर, वापस ऊपर reducers पर अगर अलग हो गए।

यदि आप अपने मैपर से थोड़ा अधिक कोड पोस्ट करते हैं तो हम एक बेहतर उदाहरण दे सकते हैं।

अद्यतन: उस ने कहा, आपने सर्वोत्तम रास्ते के लिए कहा। सबसे सही तरीका शायद एक अलग वर्ग समूह prodID और rate एक साथ बनाने और उसे भेजने के लिए है।

+0

मैं इस समाधान (उन्हें मर्ज करने के लिए) का प्रयास करता हूं, लेकिन जब reducer में मैं स्ट्रिंग v = val.toString() का उपयोग करता हूं। विभाजन (","); स्ट्रिंग को विभाजित करने के लिए कमांड, मैं v [0] नियमित रूप से उपयोग कर सकता हूं, लेकिन जब मैं v [1] मान का उपयोग करता हूं तो मुझे "सीमाओं से बाहर सरणी" अपवाद मिलता है। –

+0

क्या आप वर्तमान में जो कुछ भी प्राप्त कर सकते हैं उसके लिए आप कुछ कोड (अपने मूल प्रश्न, या पेस्टबिन/जिथब गिस्ट में) पोस्ट कर सकते हैं? –

+0

मैंने कुछ कोड जोड़ा, धन्यवाद। –

11

सबसे अच्छा तरीका है CustomWritables

इस दोहरे मूल्य के लिए है लिखने के लिए है। आपको लगता है कि पाठ बदलने के लिए या स्ट्रिंग

import java.io.DataInput; 
import java.io.DataOutput; 
import java.io.IOException; 
import org.apache.hadoop.io.Writable; 


/** 
* @author Unmesha SreeVeni U.B 
* 
*/ 
public class TwovalueWritable implements Writable { 
    private double first; 
    private double second; 

    public TwovalueWritable() { 
     set(first, second); 
    } 
    public TwovalueWritable(double first, double second) { 
     set(first, second); 
    } 
    public void set(double first, double second) { 
     this.first = first; 
     this.second = second; 
    } 
    public double getFirst() { 
     return first; 
    } 
    public double getSecond() { 
     return second; 
    } 
    @Override 
    public void write(DataOutput out) throws IOException { 
     out.writeDouble(first); 
     out.writeDouble(second); 
    } 
    @Override 
    public void readFields(DataInput in) throws IOException { 
     first = in.readDouble(); 
     second = in.readDouble(); 
    } 

    /* (non-Javadoc) 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     long temp; 
     temp = Double.doubleToLongBits(first); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     temp = Double.doubleToLongBits(second); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     return result; 
    } 
    /* (non-Javadoc) 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null) { 
      return false; 
     } 
     if (!(obj instanceof TwovalueWritable)) { 
      return false; 
     } 
     TwovalueWritable other = (TwovalueWritable) obj; 
     if (Double.doubleToLongBits(first) != Double 
       .doubleToLongBits(other.first)) { 
      return false; 
     } 
     if (Double.doubleToLongBits(second) != Double 
       .doubleToLongBits(other.second)) { 
      return false; 
     } 
     return true; 
    } 
    @Override 
    public String toString() { 
     return first + "," + second; 
    } 
} 

और नक्शाकार से तुम सिर्फ फेंकना कर सकते हैं यह रूप में

context.write(key,new TwovalueWritable(prodID,rate)); 

आशा इस मदद करता है।

+0

इसके अच्छे समाधान हैं, लेकिन मैं स्ट्रिंग के साथ अटक गया है कि कैसे बराबर विधि को ओवरराइड करें ... –

+0

@RaviHTapela: यदि आप एक्लिप्स आईडीई का उपयोग कर रहे हैं - बराबर है, हैशकोड स्वचालित रूप से जेनरेट किया जा सकता है –

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