2015-01-06 26 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

我不明白这个问题 –