我正在尝试从txt文件中读取并写入HBase。
Job Class
Job job = new Job(conf, "HWriterJob");
job.setJarByClass(HWriterJob.class);
FileInputFormat.setInputPaths(job, new Path(otherArgs[0]));
job.setMapperClass(TokenizerMapper.class);
job.setOutputKeyClass(ImmutableBytesWritable.class);
job.setOutputValueClass(Put.class);
TableMapReduceUtil.initTableReducerJob(table,null,job);
Mapper Class
@Override
public void map(Text key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer st = new StringTokenizer(line, "|");
String result[] = new String[st.countTokens()];
int i = 0;
while (st.hasMoreTokens()) {
result[i] = st.nextToken();
i++;
}
Map<ImmutableBytesWritable,Put> resultSet = writeToHBase(result);
for (Map.Entry<ImmutableBytesWritable,Put> entry : resultSet.entrySet()) {
context.write(new Text(entry.getValue().getRow()), entry.getValue());
}
}
Reducer Class
public void reduce(Text key, Iterable<Put> values, Context context)
throws IOException, InterruptedException {
for (Put val : values) {
context.write(key, val);
}
}
但我没有做到这一点。
我收到以下错误java.lang.ClassCastException:org.apache.hadoop.io.LongWritable无法强制转换为org.apache.hadoop.io.Text
答案 0 :(得分:0)
显然,MR默认为LongWritable作为MapOutputKeyClass,在你的情况下应该是Text,因此应该是错误。
尝试设置 job.setMapOutputKeyClass(Text.class)和 还适当地设置了job.setMapOutputValueClass。
答案 1 :(得分:0)
@Job Class
Job job = new Job(conf, "HWriterJob");
job.setJarByClass(HWriterJob.class);
FileInputFormat.setInputPaths(job, new Path(otherArgs[0]));
job.setMapperClass(TokenizerMapper.class);
TextInputFormat.setInputPaths(job, new Path(args[0]));
job.setInputFormatClass(TextInputFormat.class);
job.setOutputKeyClass(ImmutableBytesWritable.class);
job.setOutputValueClass(Put.class);
job.setOutputFormatClass(TableOutputFormat.class);
job.setNumReduceTasks(0);
System.exit(job.waitForCompletion(true) ? 0 : 1);
@Mapper
Map<ImmutableBytesWritable,Put> resultSet = writeToHBase(result);
for (Map.Entry<ImmutableBytesWritable,Put> entry : resultSet.entrySet()) {
context.write(entry.getKey(), entry.getValue());
}