将MapWritable转换为字符串

时间:2014-03-17 23:16:05

标签: java hadoop mapreduce hashmap

我在Hadoop Map Reduce程序中使用MapWritable。当我将MapWritable地图发布为new Text (mapName.toString())时,我得到以下输出

key1      org.apache.hadoop.io.MapWritable@396cbd97 
key2      org.apache.hadoop.io.MapWritable@17991de1 
key3      org.apache.hadoop.io.MapWritable@18f63055 

您能否告诉我如何以简单的方式打印它而不是迭代它?我知道我们只需调用mapName.toString()即可打印HashMap。

我在Stripes方法中使用它并且我看到与Pairs方法相比性能非常差(如果您不了解Map-Reduce中的设计模式,请忽略此行。我添加此语句以向那些提供更多信息的人提供更多信息。知道它。)

任何指针都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

实现此目的的唯一方法是扩展MapWritable并覆盖toString以输出您想要的内容(这可能涉及在调用toString时或在调用toString时迭代它创建/修改地图并根据您的需要将字符串存储为字段。

MapWritable的javadoc表明它从Object继承了HashMap方法 - 您认为AbstractMap更有用的输出的原因是因为它继承了toString来自javadocObject方法覆盖了{{1}}:

  

返回此地图的字符串表示形式。字符串表示   由返回的顺序中的键值映射列表组成   map的entrySet视图的迭代器,用大括号(“{}”)括起来。邻   映射由字符“,”(逗号和空格)分隔。每   键值映射呈现为键,后跟等号   (“=”)后跟相关值。键和值被转换   通过String.valueOf(Object)来表示字符串。

答案 1 :(得分:1)

由于MapWritable是以Map的形式实现的,因此将其工作起来是微不足道的,但该成员是私有的。如果你愿意使用反射,你可以自己实现它。

有关错误报告和潜在的解决方法,请参阅https://issues.apache.org/jira/browse/HADOOP-6842。已经向Hadoop提交了一个补丁,以便正确地委派toString方法,但不幸的是,它还没有得到应用,似乎没有太大的牵引力。您也可以将补丁直接应用到您自己的Hadoop副本,但这也不理想。我建议对错误进行投票,并对问题进行评论,以便Hadoop维护人员意识到这会影响用户。

更新:此错误现已在Hadoop 2.8.0中修复。