我正在尝试从MongoDB中读取一个巨大的复杂文档到spark数据框中。当我将此数据库转换为json时,它可以工作。但是,如果我直接从MongoDB读取,我收到以下错误:引起:com.mongodb.spark.exceptions.MongoTypeConversionException:无法将STRING转换为DoubleType(值:BsonString {value =' NaN&#39 ;})
能够阅读DF并完成所有处理。当我尝试显示它或写入json / csv时出错。
at mongo $ .main(mongo.scala:270) - df.show()
使用sbt作为依赖项 mongo spark connector:2.2.1 Scala版本:2.11.6 Spark版本:2.3.0 / 2.2.0
答案 0 :(得分:0)
如错误所述,这是因为String值为{_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}
,在Spark模式中推断为Double类型。
在所有不是Double的文档中,该字段有一个值。例如:
NaN
如您所知,“NaN”表示“非数字”。在创建文档期间,可能无法插入Double的任何进程,并默认为{foo: "NaN"}
。
根据您的使用情况,有几种方法可以解决这个问题:
0
,并使用所需值{{1}}进行更新。答案 1 :(得分:0)
我有一个类似的转换问题。 Mongodb抽取了1000个文档样本来定义方案。就我而言,一千份文件不足以涵盖所有案件。我增加了样本数量,这解决了问题。 Mongo documentation
代码:
val readConfig = ReadConfig(Map(
"database" -> "myDatabase",
"collection" -> "myCollection",
"sampleSize" -> "100000"), Some(ReadConfig(sc)))
val df = sc.loadFromMongoDB(readConfig).toDF()