Del siguiente tutorial proporcionado por Mongo:
MongoSpark.save(centenarians.write.option("collection", "hundredClub").mode("overwrite"))¿Estoy en lo correcto al entender que lo que está sucediendo esencialmente es que Mongo primero descarta la colección y luego sobrescribe esa colección con los nuevos datos?
Mi pregunta es, entonces, ¿es posible usar el conector MongoSpark para actualizar registros en Mongo?
digamos que tengo datos que parecen
{"_id" : ObjectId(12345), "name" : "John" , "Occupation" : "Baker"}Entonces, lo que me gustaría hacer es fusionar el registro de la persona de otro archivo que tenga más detalles, es decir, ese archivo se parece a
{"name" : "John", "address" : "1800 some street"}el objetivo es actualizar el registro en Mongo, por lo que ahora el JSON parece
{"_id" : ObjectId(12345) "name" : "John" , "address" : 1800 some street", "Occupation" : "Baker"} Ahora aquí está la cosa, supongamos que solo queremos actualizar John , y que hay millones de otros registros que nos gustaría dejar como están.
Aquí hay algunas preguntas, intentaré desglosarlas.
Lo que está sucediendo esencialmente es que Mongo primero descarta la colección y luego sobrescribe esa colección con los nuevos datos.
Correcto, a partir de mongo-spark v2.x, si especifica el modo overwrite , MongoDB Connector for Spark primero colocará la colección y guardará el nuevo resultado en la colección. Consulte el fragmento de código fuente para obtener más información.
Mi pregunta es, entonces, ¿es posible usar el conector
MongoSparkpara actualizar registros en Mongo?
El parche descrito en SPARK-66 ( mongo-spark v1.1+) es, si un marco de datos contiene un campo _id , los datos se alterarán . Lo que significa que cualquier documento existente con el mismo valor _id se actualizará y se insertarán nuevos documentos sin valor _id existente en la colección.
Lo que me gustaría hacer entonces es fusionar el registro de la persona de otro archivo que tenga más detalles.
Como se mencionó anteriormente, debe conocer el valor _id de su colección. Pasos de ejemplo:
Person para recuperar el valor _id de John . es decir ObjectId(12345) ._id de ObjectId(12345) en su marco de datos (B - del otro archivo con más información). Utilice un valor de campo único para unir los dos marcos de datos (A y B).overwrite .solo queremos actualizar
John, y que hay millones de otros registros que nos gustaría dejar como están.
En ese caso, antes de fusionar los dos marcos de datos, filtre los registros no deseados del marco de datos B (el del otro archivo con más detalles). Además, cuando llamas a save() , especifica el modo append .