我有以下减速器类
public static class TokenCounterReducer extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
JSONObject jsn = new JSONObject();
for (Text value : values) {
String[] vals = value.toString().split("\t");
String[] targetNodes = vals[0].toString().split(",",-1);
jsn.put("source",vals[1] );
jsn.put("target",targetNodes);
}
// context.write(key, new Text(sum));
}
}
通过示例(免责声明:这里是新手),我可以看到一般输出类型似乎像键/值存储。
但是如果我的输出中没有任何键怎么办?或者如果我想要输出是其他格式(在我的例子中是 json )怎么办?
无论如何,从上面的代码来看:
我想写json
反对HDFS?
这在 Hadoop 流中非常简单。但是我如何在 Hadoop java 中做到这一点?
如果您只想将 JSON 对象列表写入 HDFS 而不关心键/值的概念,您可以使用NullWritable
在你的Reducer
产值:
public static class TokenCounterReducer extends Reducer<Text, Text, Text, NullWritable> {
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
for (Text value : values) {
JSONObject jsn = new JSONObject();
....
context.write(new Text(jsn.toString()), null);
}
}
}
请注意,您需要更改作业配置才能执行以下操作:
job.setOutputValueClass(NullWritable.class);
通过将 JSON 对象写入 HDFS,我了解到您想要存储我上面描述的 JSON 的字符串表示形式。如果您想将 JSON 的二进制表示形式存储到 HDFS 中,您需要使用SequenceFile
。显然你可以自己写Writable
为此,但我觉得如果您打算有一个简单的字符串表示,这样会更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)