无法从使用 mongo spark 连接器读取的 spark DF 中显示/写入。

Posted

技术标签:

【中文标题】无法从使用 mongo spark 连接器读取的 spark DF 中显示/写入。【英文标题】:Not able to Show/Write from spark DF read using mongo spark connector. 【发布时间】:2018-04-03 19:30:00 【问题描述】:

我正在尝试将一个巨大的复杂文档从 MongoDB 读入 spark 数据框。当我将此数据库转换为 json 时,它可以工作。但是,如果我直接从 MongoDB 读取,则会收到以下错误:Caused by: com.mongodb.spark.exceptions.MongoTypeConversionException: Cannot cast STRING into a DoubleType (value: BsonStringvalue='NaN')强>

能够读入 DF 并进行所有处理。当我尝试显示它或写入 json/csv 时出现错误。

在 mongo$.main(mongo.scala:27​​0) – df.show()

对依赖项使用 sbt mongo火花连接器:2.2.1 Scala 版本:2.11.6 Spark 版本:2.3.0/2.2.0

【问题讨论】:

似乎您正在尝试将字符串转换为双精度。您是否在 Spark 中定义了一个字段类型为 Double 但 MongoDB 中的值为 String 的模式? 感谢万巴赫蒂亚尔的回复。我没有定义任何模式,我想使用 inferschema 选项,因此它可以用于任何数据集。我交叉检查过,它在 MongoDB 中也是双倍的。 【参考方案1】:

如错误所述,这是因为有一个字符串值"NaN",它在 Spark 模式中被推断为 Double 类型。

在所有不是 Double 的文档中,该字段有一个值。例如:

_id:1, foo: 100.00
_id:2, foo: 101.00
_id:3, foo: 102.00
_id:4, foo: 103.00
...
_id:99, foo: "NaN"
_id:100, foo: 200.00

您可能知道,“NaN”的意思是“不是数字”。很可能在创建文档期间,无论哪个进程未能插入 Double,并默认为 NaN

有几种方法可以解决这个问题,具体取决于您的用例:

利用MongoDB Schema Validation 确保集合中的值在插入时具有预期的类型。 执行转换以清理数据。查询集合以查找违规字段,即foo: "NaN",并使用所需值进行更新,即0

【讨论】:

【参考方案2】:

我遇到了类似的转换问题。 Mongodb 抽取了 1000 个文档的样本来定义方案。就我而言,1000 份文件不足以涵盖所有案例。我增加了样本量,这解决了问题。 Mongo documentation

代码:

val readConfig = ReadConfig(Map(
  "database" -> "myDatabase",
  "collection" -> "myCollection",
  "sampleSize" -> "100000"), Some(ReadConfig(sc)))
val df = sc.loadFromMongoDB(readConfig).toDF()

【讨论】:

以上是关于无法从使用 mongo spark 连接器读取的 spark DF 中显示/写入。的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Spark 连接器从 GreenPlum 读取

mongo spark 大型集合的推断模式

MongoTypeConversionException:即使显式架构不包含 NullTypes,也无法使用 Mongo Spark 连接器将 STRING 转换为 NullType

如何使用适用于 Spark 的 Mongo-Hadoop 连接器删除文档(记录)

MongoDB & Spark:mongo-hadoop 和 mongo-spark 的区别

为啥 Mongo Spark 连接器为查询返回不同且不正确的计数?