将mapwritable转换为字符串

vjrehmav  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(399)

我正在使用 MapWritable 在我的hadoop map reduce程序中。当我发出 MapWritable Map为 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中的设计模式,请忽略这一行)。我添加此声明是为了向了解它的人提供更多信息)。
任何提示都将不胜感激。

pb3skfrl

pb3skfrl1#

因为mapwritable是以Map的形式实现的,所以让它工作起来很简单,但是成员是私有的。如果你愿意使用反射,你可以自己实现它。
看到了吗https://issues.apache.org/jira/browse/hadoop-6842 一个错误报告和潜在的解决办法。已经向hadoop提交了一个补丁来委托 toString 方法是正确的,但不幸的是,它并没有被应用,似乎并没有太大的吸引力。您也可以将补丁直接应用到自己的hadoop副本上,但这也不理想。我建议投票支持这个bug,或者对这个问题发表评论,让hadoop维护人员意识到这会影响用户。
更新:这个bug现在已经在hadoop2.8.0中修复了。

whitzsjs

whitzsjs2#

要做到这一点,唯一的办法就是 MapWritable 并覆盖 toString 输出您想要的内容(这可能需要在 toString 在创建/修改Map并根据需要将字符串存储为字段时调用)。
mapwritable的javadoc显示它继承了 toString 方法-这是您看到的更有用的输出的原因 HashMap 是因为它继承了 AbstractMaptoString 方法,该方法重写 Object 的,来自javadoc:
返回此Map的字符串表示形式。字符串表示法由一个键值Map列表组成,按Map的entryset视图的迭代器返回的顺序排列,用大括号(“{}”)括起来。相邻Map由字符“,”(逗号和空格)分隔。每个键值Map都呈现为键,后跟一个等号(“=”),后跟关联的值。键和值按string.valueof(object)转换为字符串。

相关问题