使用MongoSpark更新mongoData

时间:2017-01-12 23:24:15

标签: mongodb apache-spark

来自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,并且我们希望保留数百万条其他记录。

1 个答案:

答案 0 :(得分:2)

这里有几个问题,我会尝试将它们分解。

  

究竟发生了什么,Mongo首先删除了该集合,然后用新数据覆盖了该集合?

正确,从mongo-spark v2.x起,如果指定模式overwriteMongoDB Connector for Spark将首先删除集合,将新结果保存到集合中。有关详细信息,请参阅source snippet

  

我的问题是,是否可以使用MongoSpark连接器实际更新Mongo中的记录,

SPARK-66mongo-spark v1.1 +)中描述的补丁是,如果数据框包含_id字段,则数据将为upserted。这意味着将更新具有相同_id值的任何现有文档,并且将插入集合中不存在_id值的新文档。

  

我想要做的是将该人的记录与另一个有更多详细信息的文件合并

如上所述,您需要知道集合中的_id值。示例步骤:

  1. 通过阅读Person集合来创建数据框(A),以检索John的{​​{1}}值。即_id
  2. ObjectId(12345)的{​​{1}}值合并到您的数据框中(B - 来自其他文件,包含更多信息)。利用唯一字段值来连接两个数据帧(A和B)。
  3. 保存合并的数据框(C)。未指定_id模式。
  4.   

    我们只想更新ObjectId(12345),并且我们希望保留数百万条其他记录。

    在这种情况下,在合并两个数据帧之前,过滤掉数据帧B中的任何不需要的记录(来自另一个文件的记录中有更多详细信息)。此外,当您致电overwrite时,请指定模式John