MapReduce实现矩阵相乘java代码及实例
时间: 2024-05-13 21:18:57 浏览: 82
下面是MapReduce实现矩阵相乘的Java代码及实例:
Map阶段:
```java
public static class MapperClass extends Mapper<LongWritable, Text, Text, Text> {
private Text outKey = new Text();
private Text outValue = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
Configuration conf = context.getConfiguration();
int m = Integer.parseInt(conf.get("m"));
int p = Integer.parseInt(conf.get("p"));
String line = value.toString();
String[] values = line.split(",");
if (values[0].equals("M")) {
for (int k = 0; k < p; k++) {
outKey.set(values[1] + "," + k);
outValue.set(values[0] + "," + values[2] + "," + values[3]);
context.write(outKey, outValue);
}
} else {
for (int i = 0; i < m; i++) {
outKey.set(i + "," + values[2]);
outValue.set(values[0] + "," + values[1] + "," + values[3]);
context.write(outKey, outValue);
}
}
}
}
```
Reduce阶段:
```java
public static class ReducerClass extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
String[] value;
HashMap<Integer, Float> mapA = new HashMap<Integer, Float>();
HashMap<Integer, Float> mapB = new HashMap<Integer, Float>();
for (Text val : values) {
value = val.toString().split(",");
if (value[0].equals("M")) {
mapA.put(Integer.parseInt(value[1]), Float.parseFloat(value[2]));
} else {
mapB.put(Integer.parseInt(value[1]), Float.parseFloat(value[2]));
}
}
int n = Integer.parseInt(context.getConfiguration().get("n"));
float result = 0.0f;
float m_ij;
float n_jk;
for (int j = 0; j < n; j++) {
m_ij = mapA.containsKey(j) ? mapA.get(j) : 0.0f;
n_jk = mapB.containsKey(j) ? mapB.get(j) : 0.0f;
result += m_ij * n_jk;
}
context.write(key, new Text(Float.toString(result)));
}
}
```
实例:
输入的矩阵A和矩阵B为:
矩阵A:
```
1,2,3
4,5,6
```
矩阵B:
```
7,8
9,10
11,12
```
执行MapReduce程序后,输出的矩阵C为:
矩阵C:
```
58,64
139,154
```