2017-07-05 5 views
0

Ich habe einen Prozess, der Daten von einem Mongodb mit mongoexport exportiert. Als documentation erwähnt alle json Ausgabe ist in Strict ModusMongoexport strenge JSON Last in Spark

Dies bedeutet, Daten wie folgt aussehen:

"{amount":{"$numberLong":"3"},"count":{"$numberLong":"245"}} 

Wo, wie meine Scala Fallklasse definiert ist als:

case class MongoData(amount: Long, count: Long) 

Lesen der Daten wird natürlich wie folgt fehlschlagen:

spark 
     .read 
     .json(inputPath) 
     .as[MongoData] 

Gibt es eine Möglichkeit, entweder den Export von Mongo ohne den strikten Modus oder die json in Scala zu importieren, ohne jedes Feld auf die entsprechende Struktur manuell Umstrukturierung?

Antwort

0

Ich verwende dies jetzt als Lösung. aber es fühlt sich etwas hacky an.

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

'mongoexport' ist so konzipiert, json zu produzieren, die roundtripped werden kann. Voraussetzung dafür ist, dass keine Typinformationen verloren gehen. Ich denke, Ihre Lösung funktioniert gut in Anbetracht der Art der Eingabe. – Ross

+0

Gibt es andere Open Source (CLI) Tools, die den Export von Mongo ohne die strikte Option erlauben? –

+0

Momentan, jedoch aufgrund von [DRIVERS-342] (https://jira.mongodb.org/browse/DRIVERS-342), wird eine entspannte JSON-Spezifikation gerade ratifiziert. Einmal eingestellt, werden alle unterstützten Treiber aktualisiert und fügen die neue entspannte Einstellung hinzu. Ich bin nicht sicher, ob es aktuelle Pläne für den Server gibt, um es auch zu unterstützen. – Ross