2017-07-05 6 views
0

私はmongoexportを使ってmongodbからデータをエクスポートするプロセスを持っています。Mongoexport strict json load in Spark

:私のScalaのケースクラスは次のように定義されるよう

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

documentationとして は、すべてのJSON出力は厳格モードで

である。これは、データが次のようになります意味言及します

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

データの読み込みはもちろん失敗します:

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

strictモードなしモンゴからの輸出のいずれかにするか、手動で適切な構造に各フィールドを再構築することなく、スカラ座でJSONをインポートする方法はありますか?

答えて

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

'mongoexport'はroundtrippedすることができるJSONを生成するように設計されています。そのための要件は、タイプ情報を失わないということです。私はあなたのソリューションが入力の性質を考慮してうまくいくと思います。 – Ross

+0

厳密なオプションなしでmongoからのエクスポートを可能にする他のオープンソース(cli)ツールがありますか? –

+0

現在、[DRIVERS-342](https://jira.mongodb.org/browse/DRIVERS-342)の結果、リラックスしたスタイルのJson仕様が批准されています。設定が完了すると、サポートされているすべてのドライバが更新され、新しい緩やかな設定が追加されます。私はサーバーがそれをサポートするための現在の計画があるかどうか分からない。 – Ross