gpt4 book ai didi

java - ClassCastException:java.lang.Exception: mapred 中的 java.lang.ClassCastException

转载 作者:可可西里 更新时间:2023-11-01 14:52:48 29 4
gpt4 key购买 nike

我正在编写一个 mapreduce 应用程序,它接受(键,值)格式的输入并只显示与 reducer 输出相同的数据。

这是示例输入:

1500s   1
1960s 1
Aldus 1

在下面的代码中,我使用 <<>> 指定输入格式,并在 main() 中将分隔符指定为制表符。当我运行代码时,我遇到了错误消息:

java.lang.Exception: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable
at cscie63.examples.WordDesc$KVMapper.map(WordDesc.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

尝试了不同的调试方法,但无济于事。

public class WordDesc {

public static class KVMapper
extends Mapper<Text, LongWritable, Text, LongWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Text key, LongWritable value , Context context
) throws IOException, InterruptedException {
context.write(key,value);
}
}


public static class KVReducer
extends Reducer<Text,LongWritable,Text,LongWritable> {

private IntWritable result = new IntWritable();
public void reduce(Text key, LongWritable value,
Context context
) throws IOException, InterruptedException {
context.write(key, value);
}
}

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", "\t");
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length < 2) {
System.err.println("Usage: wordcount <in> [<in>...] <out>");
System.exit(2);
}
Job job = new Job(conf, "word desc");
job.setInputFormatClass(KeyValueTextInputFormat.class);
job.setJarByClass(WordDesc.class);
job.setMapperClass(KVMapper.class);
job.setCombinerClass(KVReducer.class);
job.setReducerClass(KVReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
for (int i = 0; i < otherArgs.length - 1; ++i) {
FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
}
FileOutputFormat.setOutputPath(job,
new Path(otherArgs[otherArgs.length - 1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

最佳答案

我猜这行 job.setInputFormatClass(KeyValueTextInputFormat.class); 告诉您的程序将您的输入视为 Text。因此,当您要求输入值是 LongWritable 时,您会收到此异常。

一个快速解决方法是将您的输入读取为文本,然后,如果您想使用 LongWritable,请使用以下方法解析它:

public static class KVMapper 
extends Mapper<Text, Text, Text, LongWritable>{
private final static LongWritable val = new LongWritable();
public void map(Text key, Text value, Context context) {
val.set(Long.parseLong(value.toString()));
context.write(key,val);
}
}

它的作用如下:value 是 Text,然后 value.toString() 给出这个 Text 的 String 表示,然后 Long.parseLong() 解析这个字符串一样长。最后,val.set() 将其转换为 LongWritable。

顺便说一句,我认为您不需要为此使用 Reducer...您可以通过将 reduce 任务的数量设置为 0 来使其更快。

关于java - ClassCastException:java.lang.Exception: mapred 中的 java.lang.ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447407/

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