无法从使用 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:270) – 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 中显示/写入。的主要内容,如果未能解决你的问题,请参考以下文章
MongoTypeConversionException:即使显式架构不包含 NullTypes,也无法使用 Mongo Spark 连接器将 STRING 转换为 NullType
如何使用适用于 Spark 的 Mongo-Hadoop 连接器删除文档(记录)