2016-10-24 4 views
4

Ich versuche, die JSON-Datei mit Spark v2.0.0 zu lesen. Bei einfachem Datencode klappt das wirklich gut. Im Falle von wenig komplexen Daten, wenn ich df.show() drucke, werden die Daten nicht richtig angezeigt.Lesen der JSON-Datei mit Apache Spark

hier ist mein Code:

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

Hier ist mein Beispieldaten:

{ 
    "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" 
       } 
      } 
     } 
    } 
} 

Und meine Ausgabe ist wie:

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

Antwort

5

Sie das JSON formatiert werden müssen eine Zeile, wenn Sie dieses JSON lesen müssen. Dies ist ein mehrzeiliger JSON und daher nicht gelesen wird und geladen richtig (One Object one Row)

die JSON API Zitiert:

Lädt eine JSON Datei (ein Objekt pro Zeile) und gibt das Ergebnis als einen Datenrahmen.

{"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"}}}}} 

Ich habe gerade versuchte es auf der Schale, soll es aus dem Code arbeiten und die gleiche Art und Weise (ich hatte den gleichen beschädigt Satzfehler, wenn ich eine mehrzeilige JSON lesen)

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> 

Edits:

Sie können die Werte aus diesem Datenrahmen aussteigen jede Aktion, beispielsweise

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


scala> 

sollten Sie in der Lage sein, es aus dem Code zu tun

auch
+0

Danke für Ihre Antwort .. als ich versuchte, habe ich dies als Ausgabe. + -------------------- + | Glossar | + -------------------- + | [[[[ISO 8879: 1986 ... | + -------------------- + – user6325753

+0

Das ist zu erwarten. Eine Beispielaktion hinzugefügt, um die Auswertung/Verarbeitung anzuzeigen –

3

So stellen Sie sicher, dass Ihre json in einer Zeile ist, dass Sie so verschachtelte json lesen, wenn Sie dies bereits getan haben Sie geladen erfolgreich die json Sie es zeigen, sind in falscher Weise seine verschachtelten json so kann nicht direkt zeigen, wie wenn Sie die Titeldaten von GlossDiv wollen Sie es wie folgt zeigen

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

Versuchen:

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

Dieser Thread ist wenig alt, ich möchte nur weiter ausführen was @ user6022341 vorgeschlagen hat. Ich verwendete es am Ende eines meiner Projekte:

Um die mehrzeilige JSON-Datei zu verarbeiten, ist die Transformation von ganzenTextFiles (String-Pfad) die einzige Lösung in Spark, wenn die Datei ein großes JSON-Objekt ist. Diese Umwandlung lädt den gesamten Dateiinhalt als Zeichenfolge. Also, wenn Sie im Verzeichnis hdfs: // a-hdfs-path zwei Dateien hatten, nämlich part-00000 und part-00001. Der Aufruf von sparkContext.wholeTextFiles ("hdfs: // a-hdfs-path") führt dazu, dass Spark ein JavaPairRDD zurückgibt, das den Schlüssel als Dateinamen und Wert als Inhalt der Datei hat. Dies ist möglicherweise nicht die beste Lösung und kann die Leistung für größere Dateien beeinträchtigen.

Aber wenn die mehrzeilige JSON-Datei hatte mehrere JSON-Objekte in mehrere Zeilen aufgeteilt, dann könnten Sie wahrscheinlich die hadoop.Configuration, einige Beispiel-Code wird here gezeigt. Ich habe das selbst nicht getestet.

Wenn Sie einen mehrzeiligen CSV-Datei lesen hatte, konnte man dies mit Funken 2,2

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

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

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

hoffe, das hilft anderen Leuten für ähnliche Informationen suchen .