java—借助morphia在hadoop中使用mongodb数据

0yycz8jy  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(372)

我一直在使用mongoinputformat,它允许mongodb集合中的所有文档通过hadoop编写的mapreduce作业。
正如您在提供的示例(this、this和this)中所看到的,提供给Map器的文档所处的类型是bsonobject(java中的接口)。
现在我也非常喜欢morphia,它允许将mongodb中的原始数据Map到pojo中,而pojo更易于使用。
因为我只能获得一个bsonobject作为输入,所以我考虑使用morphia wiki本页底部描述的方法:

BlogEntry blogEntry = morphia.fromDBObject(BlogEntry.class, blogEntryDbObj);

我的问题是这个方法需要dbobject而不是bsonobject。dbobject实际上是:

public interface DBObject extends BSONObject

如您所见,我不能简单地从bsonobject转换为dbobject并调用提供的方法。
我怎样才能最好地处理这个问题?

w3nuxt5m

w3nuxt5m1#

我找到了一个适合我的解决方案:
首先将其转换为json文本字符串
将其解析为dbobject
使用morphia将其Map到一个有用的示例。
实际上,我现在有了这样的东西:

BSONObject bson; // Filled by the MongoInputFormat

EntityCache = entityCache = new DefaultEntityCache();
String json = JSON.serialize(bson)    
DBObject dbObject = (DBObject) JSON.parse(json);
BlogEntry blogEntry = morphia().fromDBObject(BlogEntry.class, dbObject, entityCache);
ftf50wuq

ftf50wuq2#

你会注意到 BSONObject 以及 DBObject 接口非常相似。仅仅因为converson不存在并不意味着创建一个琐碎的converson是不容易的:

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);

相关问题