使用 MongoSpark 更新 mongoData

The*_*0s3 4 mongodb apache-spark

来自Mongo提供的以下教程:

MongoSpark.save(centenarians.write.option("collection", "hundredClub").mode("overwrite"))
Run Code Online (Sandbox Code Playgroud)

我的理解是否正确,本质上发生的是 Mongo 首先删除集合,然后用新数据覆盖该集合?

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

假设我的数据看起来像

{"_id" : ObjectId(12345), "name" : "John" , "Occupation" : "Baker"}
Run Code Online (Sandbox Code Playgroud)

然后我想做的是合并另一个具有更多详细信息的文件中的人的记录,即该文件看起来像

{"name" : "John", "address" : "1800 some street"}
Run Code Online (Sandbox Code Playgroud)

目标是更新 Mongo 中的记录,所以现在 JSON 看起来像

{"_id" : ObjectId(12345) "name" : "John" , "address" : 1800 some street", "Occupation" : "Baker"}
Run Code Online (Sandbox Code Playgroud)

现在事情是这样的,假设我们只想更新John,并且还有数百万条其他记录我们希望保持原样。

Wan*_*iar 5

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

\n\n
\n

本质上发生的事情是 Mongo 首先删除集合,然后用新数据覆盖该集合?

\n
\n\n

正确的是,从mongo-spark v2.x开始,如果您指定 mode overwriteMongoDB Connector for Spark将首先删除集合,并将新结果保存到集合中。请参阅源代码片段以获取更多信息。

\n\n
\n

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

\n
\n\n

SPARK-66( v1.1+)上描述的补丁mongo-spark是,如果数据帧包含_id字段,则数据将被更新插入。这意味着任何具有相同_id值的现有文档都将被更新,并且_id集合中没有现有值的新文档将被插入。\xc2\xa0

\n\n
\n

然后我想做的是合并另一个具有更多详细信息的文件中的人的记录

\n
\n\n

如上所述,您需要了解_id您的收藏的价值。步骤示例:

\n\n
    \n
  1. Person通过从集合中读取来检索John\ 的值来创建数据框 (A) _id。IE ObjectId(12345)
  2. \n
  3. _id将的值合并ObjectId(12345)到您的数据框中(B - 来自具有更多信息的其他文件)。利用唯一的字段值连接两个数据帧(A 和 B)。
  4. \n
  5. 保存合并的数据框 (C)。不指定overwrite模式。
  6. \n
\n\n
\n

我们只想更新\xc2\xa0 John,并且还有数百万条其他记录我们希望保持原样。

\n
\n\n

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

\n