我一直在玩MongoInputFormat,它允许将MongoDB集合中的所有文档通过以Hadoop编写的MapReduce作业放置。
如您在提供的示例(this,this和this)中看到的那样,提供给映射器的文档所处的类型是BSONObject(Java中的接口(interface))。
现在,我也非常喜欢Morphia,它可以将MongoDB中的原始数据映射到更易于使用的POJO中。
由于我只能获取BSONObject作为输入,因此我考虑使用Morphia Wiki this page底部描述的方法:
BlogEntry blogEntry = morphia.fromDBObject(BlogEntry.class, blogEntryDbObj);
我的问题是此方法需要DBObject而不是BSONObject。
DBObject实际上是:
public interface DBObject extends BSONObject
如您所见,我不能简单地从BSONObject转换为DBObject并调用提供的方法。
我该如何处理最好的方法?
最佳答案
您会注意到BSONObject
和DBObject
接口(interface)非常相似。仅仅因为没有对话者并不意味着创建一个琐碎的对话并不容易:
class BSONDBObject extends BasicBSONObject implements DBObject {
boolean ispartial = false;
public BSONDBObject(BSONObject source) {
this.putAll(source);
}
public boolean isPartialObject() {
return ispartial;
}
public void markAsPartialObject() {
this.ispartial = true;
}
}
现在,您只需要
BSONObject bson; // Filled by the MongoInputFormat
BSONBDObject dbo = BSONDBObject(bson);
EntityCache = entityCache = new DefaultEntityCache();
BlogEntry blogEntry = morphia().fromDBObject(BlogEntry.class, dbo, entityCache);
关于java - 在Morphia的帮助下在Hadoop中使用MongoDB数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12555733/