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

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

标签: mongodb scala apache-spark


【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2022-08-11
      • 2020-02-12
      • 2017-08-13
      • 2021-03-07
      相关资源
      最近更新 更多