2015-01-06 45 views
0

需要從我的映射器發出兩個鍵和兩個值。你能否給我提供信息,如何編寫代碼和數據類型。例如: -mapreduce - 爲多個鍵和值編碼

key = { store_id : this.store_id, 
     product_id : this.product_id }; 

    value = { quantity : this.quantity, 
      price : this.price, 
      count : this.count }; 

    emit(key, value); 

問候

+0

提供從輸入文件中的樣本行和根據需要達到的目的一個例子來解釋。 一個單個鍵是否包含兩個部分,一個單一值是否包含三個部分? 如果是,最好的選擇是爲您的值創建自定義Writable,爲您的密鑰創建WritableComparable。 –

+0

我有一個文本文件,例如。 A B B C A R A D S D A C A R S D F A B. 我試圖找出哪個字母/單詞最有可能在單詞/字母表'A'之後說出。換句話說,我試圖做兩種不同的字數,例如。 word_count(A B)和word_count(A),那麼我需要找到比例,例如。 word_count(A *)/ word_count(A) – gbs74

回答

1

由於每個給出的示例,ABBCARADSDACARSDFAB

從映射器發出

key - A 
value A, AB 

key - B 
value B,BB 

key - B 
value B, BC 

key - C 
value C, CA 

等等...

在減速機,你可以得到分組數值

key - A 
values A, AB, A, AR, A, AD, A, AC and so on 

key - B 
value - B, BB,B,BC and so on 

添加一個分隔符您所選擇的2個字之間/字母

在減速每個鍵,您可以使用HashMap/mapwritable跟蹤每個值

即,例如發生數

A - 5 times 
AB - 7 times 

等等等等

然後可以計算出比率

樣本映射器執行

public class TestMapper extends Mapper<LongWritable, Text, Text, Text> { 

    @Override 
    public void map(LongWritable key, Text value, Context context) 
      throws IOException, InterruptedException { 
     String[] valueSplits = value.toString().split(" "); 
     for(int i=0;i<valueSplits.length;i++){ 
      if(i!=valueSplits.length-1){ 
       context.write(new Text(valueSplits[i]),new Text(valueSplits[i]+"~"+valueSplits[i+1])); 
      } 
      context.write(new Text(valueSplits[i]), new Text(valueSplits[i])); 
     } 
    } 

} 

樣品減速器執行

public class TestReducer extends Reducer<Text, Text, Text, Text> { 

    public void reduce(Text key, Iterable<Text> values, Context context) 
      throws IOException, InterruptedException { 
     Map<String,Integer> countMap= new HashMap<String,Integer>(); 
     for(Text t : values){ 
      String value = t.toString(); 
      int count =0; 
      if(countMap.containsKey(value)){ 
       count = countMap.get(value); 
       count+=1; 
      }else{ 
       count =1; 
      } 
      countMap.put(value, count); 
     } 

     for(String s : countMap.keySet()){ 
      if(s.equalsIgnoreCase(key.toString())){ 

      }else{ 
       int keyCount = countMap.get(s.split("~")[0]); 
       int occurrence = countMap.get(s); 
       context.write(new Text(key.toString()+" , "+s), new Text(String.valueOf((float)occurrence/(float)keyCount))); 
      } 
     } 
    } 

} 

對於

A A A B 

輸入減速器將發射

A , A~A 0.6666667 
A , A~B 0.33333334 

AA出現2次,AB 1次和A 3次。

AA是因此2/3 AB是因此1/3

+0

謝謝,我們可以按降序排列(這已經是因爲那裏了)。但讓我們有像B B A B B B B B這樣的數據集。 – gbs74

+0

如果我只想查看前3個鍵,該怎麼辦? – gbs74

+0

我不明白這個問題 –