java - 使用 Gora 到 MongoDB 将字符串映射保存到列表

标签 java mongodb avro gora

我试图使用 Gora 将包含要列表的字符串映射的 POJO 持久保存到 MongoDB。我遇到了异常。

java.lang.Exception: java.lang.RuntimeException: java.lang.IllegalStateException: Field ARRAY: To store a Gora 'array', target Mongo mapping have to be of 'list' type
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Field ARRAY: To store a Gora 'array', target Mongo mapping have to be of 'list' type
    at org.apache.gora.mapreduce.GoraRecordWriter.write(GoraRecordWriter.java:76)
    at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:635)
    at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89)
    at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112)
    at org.apache.nutch.parse.ParserJob$ParserMapper.map(ParserJob.java:147)
    at org.apache.nutch.parse.ParserJob$ParserMapper.map(ParserJob.java:87)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Field ARRAY: To store a Gora 'array', target Mongo mapping have to be of 'list' type
    at org.apache.gora.mongodb.store.MongoStore.toDBObject(MongoStore.java:747)
    at org.apache.gora.mongodb.store.MongoStore.mapToMongo(MongoStore.java:909)
    at org.apache.gora.mongodb.store.MongoStore.toDBObject(MongoStore.java:742)
    at org.apache.gora.mongodb.store.MongoStore.newUpdateSetInstance(MongoStore.java:689)
    at org.apache.gora.mongodb.store.MongoStore.performPut(MongoStore.java:349)
    at org.apache.gora.mongodb.store.MongoStore.put(MongoStore.java:326)
    at org.apache.gora.mongodb.store.MongoStore.put(MongoStore.java:70)
    at org.apache.gora.mapreduce.GoraRecordWriter.write(GoraRecordWriter.java:67)
    ... 14 more

我的POJO如下

public class Host{
    Map<String, List<String>> outlinks;

    public Map<String, List<String>> getOutlinks() {
        return outlinks;
    }

    public void setOutlinks(Map<String, List<String>> outlinks) {
        this.outlinks = outlinks;
    }   
}

我已定义 Avro 架构如下

{
  "name": "Host",
  "type": "record",
  "namespace": "com.mypackage",
  "doc": "Some information",
  "fields": [
    {
      "name": "outlinks",
      "type": {
        "type": "map",
        "values":{
            "type":"array",
            "items":"string"
        }
      },
      "default": null
    }    
  ]
}

我定义了 gora-mongodb-mapping.xml 如下

<gora-otd>
    <class name="com.mypackage.Host" keyClass="java.lang.String" document="host">
        <field name="outlinks" docfield="outlinks" type="document"/>
    </class>
</gora-otd>

我无法理解我在这里错过了什么。请求请帮忙。 TIA

最佳答案

我想建议您在 mongoDB 中正确存储数据..存储数据的理想方式是..您也可以使用简单的 mongodb 查询在外链上进行搜索。 你不需要那个 xml 文件..

public class Host{
     Strin key;
     List<String> outlinks;

    public void setKey(String key) {
        this.key = key;
    }
    public String getKey() {
        return key;
    }

    public void setOutlinks(List<String> outlinks) {
        this.outlinks = outlinks;
    }   
    public List<String> getOutlinks(){
        return outlinks;
   }

}

关于java - 使用 Gora 到 MongoDB 将字符串映射保存到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62454810/

相关文章:

mongodb - 从 mongodb 文档 _id 字段获取日期和时间

mongodb - 无法在 Docker 上使用 Rocketchat 连接到本地主机

java - 使用 GenericRecord 在 Avro 中用数组填充嵌套记录

java - 在 Xamarin.Android 中加载 .so 文件

java - 如何在不从队列中删除消息的情况下使用java读取MQ消息

java - 从实际复制的 DuplicateKeyException 中检索特定的 MongoDB 键 (Java/Spring)

java - java.lang.String 类型的类 MyJavaClass 中的值 foo 在 Java 类和 Scala 特征中具有不兼容的类型混合

mongodb - 查询整个 MongoDB 集合以进行 ETL 的最佳方式

hadoop - 如何使用PIG在HDFS中存储Avro格式?

avro - 空列表作为AVRO数组中的默认值