我正在尝试使用Scala和Mongodb执行批量写入。目前,我正在使用ArrayBuffer缓冲一些文档,并在一段时间后调用bulkwrite函数进行保存。
我有以下代码:
def saveActivity(activity: Activity) {
saveCount += 1;
val myDoc = Json.toJson(activity).toString
var doc: Document = Document(myDoc)
doc += "initialTime" -> BsonDateTime.apply(activity.initialTime);
doc += "endingTime" -> BsonDateTime.apply(activity.endingTime);
val fId = fileIdsMap.get(activity.file_id);
doc += "file_id" -> fId;
doc += "userId" -> usersMap.get(activity.meta.userId)
if(doc == null)
println("Inserting a null document!")
activitiesBuffer.append(doc);
if(saveCount % 1000 == 0) {
bulkSave(activitiesBuffer);
activitiesBuffer.clear()
}
}
我使用bulkwrite保存的代码如下:
def bulkSave(batch:ArrayBuffer[Document]) {
val requests = batch.map(doc => {
if(doc == null)
println(s"Found a null document");
new InsertOneModel[Document](doc)
})
val observable = MongoFactory.MyCollection.bulkWrite(requests.toList, new BulkWriteOptions().ordered(false))
val ed = Await.result(observable.toFuture, Duration.Inf).asInstanceOf[List[com.mongodb.bulk.BulkWriteResult]](0)
println(s"BULKWRITE FINISHED")
}
我的主循环是消耗来自KafkaPool的jsons:
while (true) {
val records = consumer.poll(1000)
for (record <- records) {
val json: JsValue = Json.parse(record.value())
val arquivo = Json.fromJson[Activity](json);
val activity = json.as[Activity]
saveActivity(activity)
}
}
问题是在某种程度上,在arraybuffer的中间插入了一个空文档。
这两张照片用于验证何时出现空文件。 (saveActivity
函数中的一个和bulkSave
函数中的一个。从这两个中,只调用bulkwrite map
函数中的一个。实际将文档附加到缓冲区的那个永远不会被调用。我收到以下错误:
java.lang.IllegalArgumentException:document不能为null java.lang.IllegalArgumentException:document不能为null com.mongodb.assertions.Assertions.notNull(Assertions.java:37)at com.mongodb.client.model.InsertOneModel。(InsertOneModel.java:37) 在Translator $$ anonfun $ 5.apply(Translator.scala:101)at 翻译$$ anonfun $ 5.apply(Translator.scala:96)at scala.collection.TraversableLike $$ anonfun $表$ 1.适用(TraversableLike.scala:245) 在 scala.collection.TraversableLike $$ anonfun $表$ 1.适用(TraversableLike.scala:245) 在 scala.collection.mutable.ResizableArray $ class.foreach(ResizableArray.scala:59) 在scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) 在 scala.collection.TraversableLike $ class.map(TraversableLike.scala:245) 在scala.collection.AbstractTraversable.map(Traversable.scala:104) 在Translator.bulkSaveActivities(Translator.scala:96)at Translator.saveActivity(Translator.scala:146)at Translator.proccessActivity(Translator.scala:187)at 翻译$$不久$ 1 $$ anonfun $运行$ 1.适用(Translator.scala:263) 在 翻译$$不久$ 1 $$ anonfun $运行$ 1.适用(Translator.scala:256) 在scala.collection.Iterator $ class.foreach(Iterator.scala:742)at scala.collection.AbstractIterator.foreach(Iterator.scala:1194)at scala.collection.IterableLike $ class.foreach(IterableLike.scala:72)at scala.collection.AbstractIterable.foreach(Iterable.scala:54)at 译者$ anon $ 1.run(Translator.scala:256)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:745)
我试图打印地图批次,我看到了这个(只显示了一小部分):
...文献((activityCount,BsonInt32 {值= 1}), (initialTime,BsonDateTime {值= 1448272800000}), (endingTime,BsonDateTime {值= 1448276400000}), (帐户,BsonString {值=#39&; 0&#39;}), (的file_id,BsonString {值=&#39; 58d1ed13c1728a63986a6052&#39;}), (userId,BsonString {value =&#39; 58d1ed0dc1728a63986a52d8&#39;})), null , 文献((activityCount,BsonInt32 {值= 1}), (initialTime,BsonDateTime {value = 1432789200000}),(...
正如你所看到的,它上面有一个空元素,我不知道它是如何去的。有人有什么建议吗?提前致谢