来自Mongo提供的以下教程:
MongoSpark.save(centenarians.write.option("collection", "hundredClub").mode("overwrite"))
我是否理解正在发生的事情是,Mongo首先放弃了该集合,然后用新数据覆盖该集合?
我的问题是,是否可以使用MongoSpark
连接器实际更新Mongo中的记录,
我想说我的数据看起来像是
{"_id" : ObjectId(12345), "name" : "John" , "Occupation" : "Baker"}
我想要做的是将该人的记录与另一个具有更多详细信息的文件合并,I.E。该文件看起来像
{"name" : "John", "address" : "1800 some street"}
目标是更新Mongo中的记录,所以现在JSON看起来像
{"_id" : ObjectId(12345) "name" : "John" , "address" : 1800 some street", "Occupation" : "Baker"}
现在就是这里,让我们假设我们只想更新John
,并且我们希望保留数百万条其他记录。
答案 0 :(得分:2)
这里有几个问题,我会尝试将它们分解。
究竟发生了什么,Mongo首先删除了该集合,然后用新数据覆盖了该集合?
正确,从mongo-spark v2.x起,如果指定模式overwrite
,MongoDB Connector for Spark将首先删除集合,将新结果保存到集合中。有关详细信息,请参阅source snippet。
我的问题是,是否可以使用
MongoSpark
连接器实际更新Mongo中的记录,
SPARK-66(mongo-spark
v1.1 +)中描述的补丁是,如果数据框包含_id
字段,则数据将为upserted。这意味着将更新具有相同_id
值的任何现有文档,并且将插入集合中不存在_id
值的新文档。
我想要做的是将该人的记录与另一个有更多详细信息的文件合并
如上所述,您需要知道集合中的_id
值。示例步骤:
Person
集合来创建数据框(A),以检索John
的{{1}}值。即_id
。 ObjectId(12345)
的{{1}}值合并到您的数据框中(B - 来自其他文件,包含更多信息)。利用唯一字段值来连接两个数据帧(A和B)。_id
模式。 我们只想更新
ObjectId(12345)
,并且我们希望保留数百万条其他记录。
在这种情况下,在合并两个数据帧之前,过滤掉数据帧B中的任何不需要的记录(来自另一个文件的记录中有更多详细信息)。此外,当您致电overwrite
时,请指定模式John
。