Ich habe versucht, eine JSON-Datei als kleine DB zu verwenden. Nachdem ich eine Template-Tabelle auf dem DataFrame erstellt hatte, habe ich sie mit SQL abgefragt und eine Exception bekommen. Hier ist mein Code:Lesen mehrzeiliger JSON in Apache Spark
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()
Ergebnis:
root
|-- _corrupt_record: string (nullable = true)
Meine JSON-Datei:
{
"id": 1,
"name": "Morty",
"age": 21
}
Exeption:
Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve 'name' given input columns: [_corrupt_record];
Wie kann ich es beheben?
UPD
_corrupt_record
ist
+--------------------+
| _corrupt_record|
+--------------------+
| {|
| "id": 1,|
| "name": "Morty",|
| "age": 21|
| }|
+--------------------+
UPD2
Es ist seltsam, aber wenn ich meine JSON neu schreiben, um es oneliner, funktioniert alles einwandfrei.
{"id": 1, "name": "Morty", "age": 21}
So ist das Problem in einem newline
.
UPD3
ich in docs fand den nächsten Satz:
Beachten Sie, dass die Datei, die als JSON-Datei angeboten wird, ist keine typische JSON-Datei. Jede Zeile muss ein separates, eigenständiges gültiges JSON-Objekt enthalten. Als Konsequenz wird eine reguläre mehrzeilige JSON-Datei meistens fehlschlagen.
Es ist nicht praktisch, JSON in einem solchen Format zu speichern. Gibt es einen Workaround, um die Multi-Liner-Struktur von JSON loszuwerden oder in oneliner zu konvertieren?
"Multiline" -Option funktionierte für mich. Danke Dan! – Omkar