我一直在玩MongoInputFormat,它允许将MongoDB集合中的所有文档通过以Hadoop编写的MapReduce作业放置。

如您在提供的示例(thisthisthis)中看到的那样,提供给映射器的文档所处的类型是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并调用提供的方法。

我该如何处理最好的方法?

最佳答案

您会注意到BSONObjectDBObject接口(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/

10-11 08:53