2016-07-23 14 views
5

JSONファイルを小さなDBとして使用しようとしていました。 DataFrameでテンプレートテーブルを作成した後、SQLでクエリを実行して例外が発生しました。ここに私のコードは次のとおりです。Apache Sparkで複数JSONを読む

val df = sqlCtx.read.json("/path/to/user.json") 
df.registerTempTable("user_tt") 

val info = sqlCtx.sql("SELECT name FROM user_tt") 
info.show() 

df.printSchema()結果:

root 
|-- _corrupt_record: string (nullable = true) 

マイJSONファイル:

{ 
    "id": 1, 
    "name": "Morty", 
    "age": 21 
} 

がExeption:私はそれを修正するにはどうすればよい

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve 'name' given input columns: [_corrupt_record]; 

? UPD

_corrupt_record

はそれは奇妙だ

+--------------------+ 
|  _corrupt_record| 
+--------------------+ 
|     {| 
|   "id": 1,| 
| "name": "Morty",| 
|   "age": 21| 
|     }| 
+--------------------+ 

UPD2

ですが、私はそれをoneliner作るために私のJSONを書き換える際に、すべてが正常に動作します。

{"id": 1, "name": "Morty", "age": 21} 

したがって、問題はnewlineです。 JSONファイルとして提供されるファイルは、典型的なJSONファイルではないことを

注:

UPD3

私は、ドキュメントに次の文を見つけました。各行には、独立した有効なJSONオブジェクトが含まれている必要があります。その結果、通常複数行のJSONファイルが失敗することがよくあります。

このような形式でJSONを保存すると便利ではありません。 JSONのマルチライン構造を取り除く、またはonelinerで変換するための回避策はありますか?

答えて

14

スパーク> = 2.2

スパークJSON(ないJSONL)ファイルをロードするために使用することができます2.2導入wholeFilemultilineオプション:

spark.read 
    .option("multiline", true).option("mode", "PERMISSIVE") 
    .json("/path/to/user.json") 

参照してください:

  • SPARK-18352 - 通常の複数行のJSONの解析fi les(JSON Linesだけでなく)
  • SPARK-20980 - JSONとCSVの場合、wholeFilemultiLineの名前を変更してください。

スパーク< 2。2

JSONL形式のデータを使用すると不便かもしれませんが、APIではなくフォーマット自体で問題ではないと私は主張します。 JSONは、分散システムで並行して処理するようには設計されていません。

スキーマは提供されていません。スキーマは提供されておらず、フォーマットや形状について非常に特殊な前提がない限り、トップレベルのドキュメントを正しく識別することはほとんど不可能です。おそらく、これはApache Sparkのようなシステムで使うことが想像できる最悪の形式です。また、分散システムに有効なJSONを書くことは、非常に難しく、典型的には実用的ではありません。

言われている。すなわち、個々のファイルが有効なJSONドキュメント(単一の文書または文書の配列のいずれか)であれば、いつでもwholeTextFilesを試すことができます。

spark.read.json(sc.wholeTextFiles("/path/to/user.json").values()) 
2

だけzero323の答えにアドオンし、スパーク内のオプションマルチラインを読むための2.2+ JSONはmultiLineに変更されました(Sparkのマニュアルhereを参照)。

したがって、正しい構文は以下のようになります。

spark.read 
    .option("multiLine", true).option("mode", "PERMISSIVE") 
    .json("/path/to/user.json") 

これはhttps://issues.apache.org/jira/browse/SPARK-20980で起こりました。

+0

"マルチライン"オプションが私のために働いていました。ありがとうダン! – Omkar

関連する問題