我尝试检索我的集合中的文档,并使用相同的值更新它们。
我在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中的文档。我只能创建新文件。
答案 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)
}