我要在这里实现的目的是将多个文档插入给多个数据库的给定集合中。
根据对象中给定的属性,数据库是不同的,因此,每个数据库都应从一个小型缓存Map中进行选择,该Map具有(它们的键,MongoCollection [指向其各自的数据库,并不总是相同])和他们所需的数据库。 .insertOne
和文档。
我发现的问题是,MongoCollectionImpl
在执行以下操作时似乎无法序列化(简化了,但是复制了错误)...
.map(
MongoClient(s"mongodb://localhost:27017")
.getDatabase("sample")
.getCollection("sample_collection")
.insertOne)
我知道MongoDB中有一个专门为Spark制作的连接器,但是我无法决定如何使用多个DB,因为我需要有条件地应用于每个元素的几个WriteConfig ,因此它们不会插入不应插入的另一个数据库中。
https://docs.mongodb.com/spark-connector/master/scala/write-to-mongodb/
有与此相关的解决方法吗?
答案 0 :(得分:1)
只需使用MongoSpark
连接器并根据条件对原始数据帧进行分区/分割。
myDataFrame.cache() // recommended to prevent repeating the calculation
val df1 = myDataFrame.filter('myColumn < 0)
val df2 = myDataFrame.filter('myColumn >= 0 && 'myColumn < 50)
val df3 = myDataFrame.filter('myColumn >= 50 )
MongoSpark.save(df1.write.mode(SaveMode.Overwrite), WriteConfig(databaseName = ???, collectionName = ???, connectionString = Some(???))
MongoSpark.save(df2.write.mode(SaveMode.Overwrite), WriteConfig(databaseName = ???, collectionName = ???, connectionString = Some(???))
MongoSpark.save(df3.write.mode(SaveMode.Overwrite), WriteConfig(databaseName = ???, collectionName = ???, connectionString = Some(???))