gpt4 book ai didi

java.lang.Object 无法转换为自己的类

转载 作者:行者123 更新时间:2023-11-30 05:26:46 25 4
gpt4 key购买 nike

我是 java/hadoop 新手,目前正在尝试重新创建我在这里找到的代码的结果: https://sunilmistri.wordpress.com/2015/02/13/mapreduce-example-for-minimum-and-maximum-value-by-group-key/

与示例相反,我只有 3 个“列”,每个列都有一个整数,由制表符 (/t) 分隔,例如100 115 3前两个数字是节点,第三个数字是节点之间的权重。现在我尝试找到第一个节点的最小和最大权重。我在代码中唯一更改的是分隔符 (/t),并且我将两个类放在一个文件中(据我所读,应该没问题)。现在,我在下面指示的行中收到错误“java.lang.Object 无法转换为 minmaxduration”。我发现类似的问题如 incompatible types : java.lang.Object cannot be converted to T但这并没有真正帮助我。我怎样才能解决这个问题?提前致谢。

import java.io.IOException;
import java.io.DataInput;
import java.io.DataOutput;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.io.*;
import org.apache.hadoop.util.*;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class Q1{

public static class DurationMapper
extends Mapper<Object, Text, Text, MinMaxDuration>{

private Text month= new Text();
private Integer minduration;
private Integer maxduration;


private MinMaxDuration outPut= new MinMaxDuration();

public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {

String[] campaignFields= value.toString().split("/t");
//10001,'telephone','may','mon',100,1,999,0,'nonexistent','no',0
month.set(campaignFields[0]);
minduration=Integer.parseInt(campaignFields[2]);
maxduration=Integer.parseInt(campaignFields[2]);

if (month == null || minduration == null || maxduration== null) {
return;
}
try {
outPut.setMinDuration(minduration);
outPut.setMaxDuration(maxduration);
context.write(month,outPut);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public static class DurationReducer
extends Reducer<Text,MinMaxDuration,Text,MinMaxDuration> {
private MinMaxDuration resultRow = new MinMaxDuration();

public void reduce(Text key, Iterable values,
Context context
) throws IOException, InterruptedException {
Integer minduration = 0;
Integer maxduration = 0;

resultRow.setMinDuration(null);
resultRow.setMaxDuration(null);

for (MinMaxDuration val : values) { //ERROR HERE

minduration = val.getMinDuration();
maxduration = val.getMaxDuration();
// get min score
if (resultRow.getMinDuration()==null || minduration.compareTo(resultRow.getMinDuration())<0) {
resultRow.setMinDuration(minduration);
}
// get min bonus
if (resultRow.getMaxDuration()==null || maxduration.compareTo(resultRow.getMaxDuration())>0) {
resultRow.setMaxDuration(maxduration);
}
} // end of for loop
context.write(key, resultRow);
}
}

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Campaign Duration Count");
job.setJarByClass(CampaignMinMax.class);
job.setMapperClass(DurationMapper.class);
job.setCombinerClass(DurationReducer.class);
job.setReducerClass(DurationReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(MinMaxDuration.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

class MinMaxDuration implements Writable {
// declare variables
Integer minDuration;
Integer maxDuration;
// constructor
public MinMaxDuration() {
minDuration=0;
maxDuration=0;
}
//set method
void setMinDuration(Integer duration){
this.minDuration=duration;
}
void setMaxDuration(Integer duration){
this.maxDuration=duration;
}
//get method
Integer getMinDuration() {
return minDuration;
}
Integer getMaxDuration(){
return maxDuration;
}

// write method
public void write(DataOutput out) throws IOException {
// what order we want to write !
out.writeInt(minDuration);
out.writeInt(maxDuration);
}

// readFields Method
public void readFields(DataInput in) throws IOException {
minDuration=new Integer(in.readInt());
maxDuration=new Integer(in.readInt());
}

public String toString() {
return minDuration + "\t" + maxDuration;
}

}



最佳答案

您在方法签名中缺少类型规范。因此它将被视为通用 Object 而不是您的具体类型。因此,将方法签名从

更改为
public void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException 

public void reduce(Text key, Iterable<MinMaxDuration> values,
Context context
) throws IOException, InterruptedException

所以你指定了正确的类型。

关于java.lang.Object 无法转换为自己的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58411012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com