2016-10-24 8 views
4

Spark v2.0.0を使用してJsonファイルを読み込もうとしています。単純なデータコードの場合は本当にうまく機能します。少し複雑なデータの場合、df.show()を印刷すると、データが正しい方法で表示されません。ここApache Sparkを使用してJsonファイルを読む

は私のコードです:

{ 
    "glossary": { 
     "title": "example glossary", 
     "GlossDiv": { 
      "title": "S", 
      "GlossList": { 
       "GlossEntry": { 
        "ID": "SGML", 
        "SortAs": "SGML", 
        "GlossTerm": "Standard Generalized Markup Language", 
        "Acronym": "SGML", 
        "Abbrev": "ISO 8879:1986", 
        "GlossDef": { 
         "para": "A meta-markup language, used to create markup languages such as DocBook.", 
         "GlossSeeAlso": ["GML", "XML"] 
        }, 
        "GlossSee": "markup" 
       } 
      } 
     } 
    } 
} 

そして、私の出力は以下のようである:ここで

SparkSession session = SparkSession.builder().master("local").appName("jsonreader").getOrCreate(); 
Dataset<Row> list = session.read().json("/Users/hadoop/Desktop/sample.json"); 
list.show(); 

は私のサンプルデータがある

+--------------------+ 
|  _corrupt_record| 
+--------------------+ 
|     {| 
|  "glossary": {| 
|  "title": ...| 
|   "GlossDiv": {| 
|   "titl...| 
|    "GlossList": {| 
|    "...| 
|     ...| 
|     "SortAs": "S...| 
|     "GlossTerm":...| 
|     "Acronym": "...| 
|     "Abbrev": "I...| 
|     "GlossDef": {| 
|     ...| 
|      "GlossSeeAl...| 
|     ...| 
|     "GlossSee": ...| 
|     }| 
|     }| 
|     }| 
+--------------------+ 
only showing top 20 rows 

答えて

5

あなたはにJSONをフォーマットする必要があります。このJSONを読まなければならない場合は1行です。これは、マルチラインJSONであり、従って、読み出しおよびJSONのAPI引用適切(One Object one Row)

ロードされていない。

ロードJSONファイル(1行に1つのオブジェクト)と データフレームとして結果を返します。

{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}} 

私は貝にそれを試み、それが

scala> val df = spark.read.json("C:/DevelopmentTools/data.json") 
df: org.apache.spark.sql.DataFrame = [glossary: struct<GlossDiv: struct<GlossList: struct<GlossEntry: struct<Abbrev: string, Acronym: string ... 5 more fields>>, title: string>, title: string>] 

scala> 
(私は複数行JSONを読んだとき、私は同じ壊れたレコードのエラーを持っていた)だけでなく、コードから同じように動作するはずです

編集:

あなたは、たとえば、任意のアクションを使用してそのデータフレームから値を取得することができます

scala> df.select(df("glossary.GlossDiv.GlossList.GlossEntry.GlossTerm")).show() 
+--------------------+ 
|   GlossTerm| 
+--------------------+ 
|Standard Generali...| 
+--------------------+ 


scala> 

あなたはすでにこれをしなかった場合はちょうどあなたのJSONはあなたがそうネストされたJSONを読んでいる1行であることを確認し、あなたがそれを示しているJSONを正常にロードされているだけでなく、あなたのコードから

+0

返信いただきありがとうございます。私は出力としてこれを取得しようとしました。+ -------------------- + |用語集| + -------------------- + | [[ISO 8879:1986 ... | + -------------------- + – user6325753

+0

そうです。評価/処理を示すサンプルアクションを追加 –

3

それを行うことができるはず間違った方法でのネストされたJSONあなたがGlossDivのタイトルデータが必要な場合は、あなたが従う

SparkSession session = SparkSession.builder().master("local").appName("jsonreader").getOrCreate(); 
Dataset<Row> list = session.read().json("/Users/hadoop/Desktop/sample.json"); 
list.select("glossary.GlossDiv.title") .show 
0

てみて、それを表示することができますようにあなたが直接、表示さカントので:私は、このスレッドは少し古いです

session.read().json(session.sparkContext.wholeTextFiles("...")); 
0

ちょっと手を加えたい@ user6022341が提案したもの

ファイルが1つの大きなjsonオブジェクトである場合、multiline jsonファイルを処理するには、wholeTextFiles(String path)変換がsparkの唯一の解決方法です。この変換により、ファイルコンテンツ全体が文字列としてロードされます。したがって、hdfs:// a-hdfs-pathディレクトリに、part-00000とpart-00001の2つのファイルがあります。 sparkContext.wholeTextFiles( "hdfs:// a-hdfs-path")を呼び出すと、SparkはJavaPairRDDを返します。このJavaPairRDDは、ファイルの内容としてファイル名と値としてkeyを持ちます。これは最善の解決策ではない可能性があり、大きなファイルではパフォーマンスが低下する可能性があります。

複数行のjsonファイルに複数の行に分割されている場合は、おそらくhadoop.Configurationを使用できますが、サンプルコードの一部はhereと表示されます。私はこれを自分自身でテストしていない。

あなたは複数行のcsvファイルを読むために持っていた場合、あなたはスパーク2.2

spark.read.csv(file, multiLine=True)

https://issues.apache.org/jira/browse/SPARK-19610

https://issues.apache.org/jira/browse/SPARK-20980

でこれを行うことができますが、これは同様の情報を探している他の人々を助けホープ。

関連する問題