由于每个给出的示例,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
提供从输入文件中的样本行和根据需要达到的目的一个例子来解释。 一个单个键是否包含两个部分,一个单一值是否包含三个部分? 如果是,最好的选择是为您的值创建自定义Writable,为您的密钥创建WritableComparable。 –
我有一个文本文件,例如。 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