我对hadoop很新......
我在hbase表中有一堆数据需要导出(通过一些小的转换)到一个平面文件。为此,我正在构建一个mapreduce作业,该作业扫描表并使用TextOutputFormat将数据映射到Text类型。
这样的事情:
TableMapReduceUtil.initTableMapperJob("tablename", // input table
scan, // Scan instance to control CF and attribute selection
MyMapper.class, // mapper class
Text.class, // mapper output key
Text.class, // mapper output value
job);
job.setNumReduceTasks(1);
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileOutputFormat.setOutputPath(job, new Path("/tmp/mydirectory"));
我的映射器:
private static class MyMapper extends TableMapper<Text, Text> {
public void map(ImmutableBytesWritable row, Result result, Context context) throws IOException,
InterruptedException {
String json = new String(result.getValue("cf".getBytes(), "qualifier".getBytes()));
StringBuilder line = new StringBuilder();
//...builds the line up
Text k = new Text("filename-20141205.txt");
Text lineText = new Text(line.toString());
context.write(k, lineText);
}
}
然而,我得到的是一个单独的文件,其中的键和数据在part-r-00000文件中。我想我需要一台减速机来完成这项工作,但我不确定它是什么样的。
身份减少器会起作用吗?除了TextOutputFormat之外,还有更好的解决方法吗?
答案 0 :(得分:0)
这有效:
private static class MyOutputFormat<K, V> extends TextOutputFormat<K, V>{
@Override
public Path getDefaultWorkFile(TaskAttemptContext context, String extension) throws IOException {
FileOutputCommitter committer =
(FileOutputCommitter) getOutputCommitter(context);
return new Path(committer.getWorkPath(), "my-file-name.txt");
}
}