如何使用mongodb spark connector v2.1中的MongoSpark.save保存isodate字段?

时间:2018-02-20 16:33:19

标签: mongodb apache-spark

大家。一点帮助会很好,我感谢你。我正在尝试保存包含日期时间字段的文档。通过MongoSpark.save()方法使用mongodbspark连接器,这可能是一个挑战:

  • 如果将字段设置为字符串,很明显将保存的是字符串,而不是isodate(即使字符串符合ISO 8601格式
  • 如果我构建一个这样的表达式:my:date:{$ date:},其中xxxx是一个以毫秒为单位的纪元时间,然后我得到这个BulkWriteError,它设置'$'符号对于存储无效

我从一个返回BsonDocument文档的库中获取要更新的文档。 Datetime字段被视为BsonDateTime字段,所以我需要在保存/更新之前进行一些转换'因为从BsonDocument获取相应的json字符串,生成$ date非有效存储的东西。

为了获得BsonDocument,我只是从另一个开发人员构建的库中调用了一个方法:

val bdoc = handlePermanentProduct(p_id, operationsByProduct)

然后我使用我写的方法转换org.bson.Document中的org.bson.BsonDocument:

val doc: Document = convert(bdoc)

然后,获取数据帧的常用代码&保存/更新我的文件

val docs = sc.parallelize(Seq(doc.toJson))
val df = sparkSession.read.json(rdd)
MongoSpark.save(df.write.option("collection", "products").option("replaceDocument", "false").mode(SaveMode.Append))

再次感谢,并提前

我正在使用Scala 2.11.8,Spark 2.11和Mongodb Spark连接v2.1

1 个答案:

答案 0 :(得分:1)

最终,我尝试用于保存/更新的方式不是正确的方法。我发现,当我想使用 MongoSpark.save(...) 方法保存/更新时,阅读文档时,有一个类型匹配过程: datetime字段可以创建为 java.sql.Timestamp ,因此驱动程序可以进行正确的转换。一旦我发现它,这真的很容易。所以,它已经解决了。