java mongo数据去重复_java – MongoSpark保存重复的密钥错误E11000

我有一个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 rddInsertRecords = rddGrouped.map(new Function, Document>() {

private static final long serialVersionUID = 1L;

@Override

public Document call(Tuple2 tuple2) throws Exception {

Document json = tuple2._2.toBSONDocument();

return json;

}

});

MongoSpark.save(rddInsertRecords, WriteConfig.create(sc.getConf()));

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

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

最佳答案 Spark Connector不知道如何upped RDD< T>其中T可以是任何类型 – 它如何获得id值?

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

如果必须使用RDD,则可以通过编程方式访问MongoDB集合并通过MongoConnector类创建upsert操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值