MongoSpark保存重复的密钥错误E11000

时间:2017-03-07 18:17:31

标签: java mongodb apache-spark

我有一个Spark应用程序,它将RDD数据写入MongoDB,并且我得到了一个 MongoBulkWriteException 。以前,我使用MongoDB标准驱动程序中的 bulkWrite()方法,但我已经开始使用MongoSpark驱动程序中的 write()方法< /强>

在此之前,我使用 Apache Spark 1.6.0 MongoDB 3.2.11

这是异常追踪:

com.mongodb.MongoBulkWriteException: Bulk write operation error on server
 10.1.101.146:27017. Write errors: [BulkWriteError{index=0, code=11000, 
message='E11000 duplicate key error collection: collection-test 
index: _id_ dup key: { : "636253651-2017-03-07" }', details={ }}]

产生它的代码是:

JavaRDD<Document> rddInsertRecords = rddGrouped.map(new Function<Tuple2<String, BasicRecord>, Document>() {
private static final long serialVersionUID = 1L;
    @Override
    public Document call(Tuple2<String, BasicRecord> tuple2) throws Exception {
          Document json = tuple2._2.toBSONDocument();
          return json;
      }
});
MongoSpark.save(rddInsertRecords, WriteConfig.create(sc.getConf()));

我有一个使用旧代码的替代解决方案,但我想使用MongoSpark编写。

我在MongoDB的JIRA(https://jira.mongodb.org/browse/SERVER-14322)中看到了这个问题,但我不知道如何绕过这个问题。

更新:我忘了提到第一次没有发生故障(即mongodb没有数据,集合为空)。它在第二次运行作业时失败。技术上司机应该做一个upsert,对吗?

1 个答案:

答案 0 :(得分:2)

Spark Connector不知道如何将RDD<T>置于其中T可以是任何类型 - 如何获取id值?

但是,Datasets / DataFrames具有架构信息,指示哪个字段是_id字段,并且可以自动用于upsert。这是在SPARK-66中完成的。数据集/数据框架的另一个好处是它们更有效,并且可以提高Spark作业的性能。

如果必须使用RDD,那么您可以通过编程方式访问MongoDB集合并通过MongoConnector类创建一个upsert操作。