【发布时间】:2020-02-18 04:10:26
【问题描述】:
我有一个数据帧,包括发送者(id,int),接收者(id,int),通信时间(int)。
A B C
1 5 10
1 6 20
1 7 20
1 8 11
我的目标是找到最大通信时间并返回 1 6,20(格式为 A B,C) 由于 A1、B6 和 A1、B7 的最大通信次数都是 20,所以我只需要保留最小的 B id 号。
在映射步骤中,我已经将 A 分隔为键,将 (B,C) 分隔为值。
到目前为止,我可以返回带有 A 和最大 C 的输出,但返回 B 值时遇到了麻烦。我下面的代码无法更改 min_Receiver,我该如何解决这个问题?
public static class IntSumReducer
extends Reducer<Text,Text,Text,Text> {
//private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<Text> values,
Context context
) throws IOException, InterruptedException {
int max_val = 0;
int val_str = 0;
int val_str_1 = 0;
int min_Receiver = Integer.MAX_VALUE;
int tempReceiver = 0;
for (Text val : values) {
String[] compositeString = val.toString().split(",");
val_str = Integer.parseInt(compositeString[1]);
//tempReceiver = Integer.parseInt(compositeString[0]);
if( val_str>max_val) {
max_val = val_str;
}
}
for (Text val_1 : values){
String[] compositeString = val_1.toString().split(",");
tempReceiver = Integer.parseInt(compositeString[0]);
val_str_1 = Integer.parseInt(compositeString[1]);
if (val_str_1 == max_val && tempReceiver < min_Receiver)
{
min_Receiver =tempReceiver;
}
}
//result.set(max_val);
context.write(key, new Text(min_Receiver + "," + max_val));}}
期望输出是
1 6,20
实际输出是
1 2147483647,20
在地图中,我已经将 A 分隔为键,将 B、C 分隔为值。所以compositeString 包含两个变量。值的格式为 B,C。
【问题讨论】:
-
第一个循环不应该看
compositeString[2]吗?使用调试器甚至打印一些值将帮助您了解发生了什么。 -
不,这里的值只包括B和C。A是关键。
-
什么是
Reducer?这是一个 Hadoop 问题吗?如果是这样,请将其标记为hadoop。 -
是的,刚刚添加。感谢您的提醒。
-
您的数据是用空格分隔的值,那么您希望
split(",")如何工作?
标签: java sorting hadoop max min