我在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中的设计模式,请忽略此行。我添加此语句以向那些提供更多信息的人提供更多信息。知道它。)
任何指针都将受到赞赏。
答案 0 :(得分:1)
实现此目的的唯一方法是扩展MapWritable
并覆盖toString
以输出您想要的内容(这可能涉及在调用toString
时或在调用toString
时迭代它创建/修改地图并根据您的需要将字符串存储为字段。
MapWritable的javadoc表明它从Object继承了HashMap
方法 - 您认为AbstractMap
更有用的输出的原因是因为它继承了toString
来自javadoc的Object
方法覆盖了{{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中修复。