首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >蒙古出口严格的火种装载

蒙古出口严格的火种装载
EN

Stack Overflow用户
提问于 2017-07-05 12:43:32
回答 1查看 512关注 0票数 1

我有一个使用mongoexport从mongodb导出数据的进程。正如文档提到的,所有json输出都处于严格的模式中。

这意味着数据将如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
"{amount":{"$numberLong":"3"},"count":{"$numberLong":"245"}}

其中,我的Scala案例类被定义为:

代码语言:javascript
代码运行次数:0
运行
复制
case class MongoData(amount: Long, count: Long)

当然,读取数据会像这样失败:

代码语言:javascript
代码运行次数:0
运行
复制
spark
      .read
      .json(inputPath)
      .as[MongoData]

有没有一种方法可以在没有严格模式的情况下从mongo导出,或者在Scala中导入json而不手动地将每个字段重组到适当的结构中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 09:51:08

我现在用这个作为解决方案。但感觉有点烦躁。

代码语言:javascript
代码运行次数:0
运行
复制
case class DataFrameExtended(dataFrame: DataFrame) {

   def undoMongoStrict(): DataFrame = {
    val numberLongType = StructType(List(StructField("$numberLong", StringType, true))) 

    def restructure(fields: Array[StructField], nesting: List[String] = Nil): List[Column] = {
      fields.flatMap(field => {
        val fieldPath = nesting :+ field.name
        val fieldPathStr = fieldPath.mkString(".")
        field.dataType match {
          case dt: StructType if dt == numberLongType =>
            Some(col(s"$fieldPathStr.$$numberLong").cast(LongType).as(field.name))
          case dt: StructType =>
            Some(struct(restructure(dt.fields, fieldPath): _*).as(field.name))
          case _ => Some(col(fieldPathStr).as(field.name))
          //              case dt:ArrayType => //@todo handle other DataTypes Array??
        }
      })
    }.toList


    dataFrame.select(restructure(dataFrame.schema.fields): _*)
  }
}

implicit def dataFrameExtended(df: DataFrame): DataFrameExtended = {
  DataFrameExtended(df)
}

spark
  .read
  .json(inputPath)
  .undoMongoStrict()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44926616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档