【问题标题】:Variable can not be passed into for loop变量不能传入for循环
【发布时间】: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


【解决方案1】:

取决于你的分隔符是什么

使用这样的行来获取最大时间的Text

Optional<Text> answer = StreamSupport.stream(values.spliterator(),false)  //all this does is get you a stream of Text
.max(Comparator.comparingInt(s->getComTime(s))); // return the object that evaluates to the max value if one exists

同时创建一个从字符串/文本中获取通信时间的方法,如下所示:

private static int getComTime(Text line){
    String[] vals = line.toString().split(",");
    return  Integer.parseInt(vals[2]);
}

.stream() 的布尔选项是如果您想要顺序 =false 或并行 =true .... 如果您的分隔符不同或对象有点不同,您可能需要调整 @987654326 @ 但这应该非常接近正确。

如果您想以这种方式处理它,请获取一个 Optional。

那你就可以了

if(answer.isPresent()){/* got an answer do something with it */}

***对不起,我用字符串而不是文本完成了大部分操作,但如果有任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多