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

时间:2018-04-03 19:30:00

标签: mongodb scala apache-spark

我正在尝试从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

2 个答案:

答案 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"}

根据您的使用情况,有几种方法可以解决这个问题:

  • 使用MongoDB Schema Validation确保集合中的值在插入时具有预期类型。
  • 执行转换以清理数据。查询集合以查找有问题的字段,即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()