由於每個給出的示例,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