Spark中的Mongo-hadoop连接器API:无法更新文档

时间:2016-01-11 14:27:08

标签: mongodb scala hadoop apache-spark

我尝试检索我的集合中的文档,并使用相同的值更新它们。

我在spark-shell中运行了这个(我的数据库和集合已经在里面创建了一个文档),但我有一个例外。

import org.apache.hadoop.conf.Configuration
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.rdd.RDD

import org.bson.BSONObject
import com.mongodb.hadoop.{
MongoInputFormat, MongoOutputFormat,
BSONFileInputFormat, BSONFileOutputFormat}

val mongoConfig = new Configuration()
mongoConfig.set("mongo.input.uri",
  "mongodb://localhost:27017/mydatabase.mycollection")

val documents = sc.newAPIHadoopRDD(
  mongoConfig,                // Configuration
  classOf[MongoInputFormat],  // InputFormat
  classOf[Object],            // Key type
  classOf[BSONObject])        // Value type

val outputConfig = new Configuration()
outputConfig.set("mongo.output.uri",
  "mongodb://localhost:27017/mydatabase.mycollection")

documents.saveAsNewAPIHadoopFile(
  "file:///this-is-completely-unused",
  classOf[Object],
  classOf[BSONObject],
  classOf[MongoOutputFormat[Object, BSONObject]],
  outputConfig)

我遇到了这个例外:

 ERROR MongoOutputCommitter: Could not write to MongoDB
com.mongodb.BulkWriteException: Bulk write operation error on server 
localhost:27017. Write errors: [com.mongodb.BulkWriteError@abea0cde].

我无法通过mongo-hadoop API找到一种方法更新存储在MongoDB中的文档。我只能创建新文件。

1 个答案:

答案 0 :(得分:0)

你需要MongoUpdateWritable而不是BsonObject。以下代码应该有效:

val updates = documents.mapValues(
      value => new MongoUpdateWritable(
        new BasicDBObject("_id", value.get("_id")),  // Query
        value.asInstanceOf[BasicBSONObject],  // Update operation
        //new BasicDBObject("$set",new BasicDBObject("key","replacedItem")),
        true,  // Upsert
        false,   // Update multiple documents
        true  //replace
      )
    )

    updates.saveAsNewAPIHadoopFile(
      "file:///this-is-completely-unused",
      classOf[Object],
      classOf[MongoUpdateWritable],
      classOf[MongoOutputFormat[Object, MongoUpdateWritable]],
      outputConfig)

  }