我有以下课程
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));
}
}
通过示例(这里的免责声明:newbie),我可以看到一般输出类型似乎类似于键/值存储。
但是如果输出中没有任何键怎么办?或者如果我的输出是其他格式的(在我的例子中是json),我想怎么办?
总之,从上面的代码:我想写 json
反对hdfs?
它在hadoop流媒体中非常微不足道。。但在hadoopjava中如何实现呢?
2条答案
按热度按时间ghhaqwfi1#
您可以使用hadoop的outputformat接口来创建自定义格式,这些格式将按照您的意愿写入数据。例如,如果需要将数据写入json对象,则可以执行以下操作:
如果您不想在输出中包含键,只需发出null,如:
hth公司
2o7dmzc52#
如果您只想将json对象的列表写入hdfs而不关心key/value的概念,那么可以使用
NullWritable
在你的Reducer
输出值:请注意,您需要更改作业配置以执行以下操作:
通过将json对象写入hdfs,我了解到您希望存储json的字符串表示形式,我在上面描述了这一点。如果要将json的二进制表示形式存储到hdfs中,则需要使用
SequenceFile
. 显然你可以自己写Writable
但是我觉得如果你想用一个简单的字符串表示的话,这样更容易。