Próbowałem użyć pliku JSON jako małej bazy danych. Po utworzeniu tabeli szablonów w DataFrame odpytałem ją za pomocą SQL i otrzymałem wyjątek. Tu jest mój kodu:Czytaj wielowierszowy JSON w 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()
wynik:
root
|-- _corrupt_record: string (nullable = true)
Mój plik 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];
Jak mogę to naprawić?
UPD
_corrupt_record
jest
+--------------------+
| _corrupt_record|
+--------------------+
| {|
| "id": 1,|
| "name": "Morty",|
| "age": 21|
| }|
+--------------------+
UPD2
To dziwne, ale kiedy przepisać moje JSON, aby go oneliner, wszystko działa bez zarzutu.
{"id": 1, "name": "Morty", "age": 21}
Problem dotyczy numeru newline
.
UPD3
znalazłem w docs następne zdanie:
Zauważ, że plik, który oferowany jest w postaci pliku json nie jest to typowy plik JSON. Każda linia musi zawierać oddzielny, samodzielny poprawny obiekt JSON. W związku z tym zwykły wieloliniowy plik JSON najczęściej kończy się niepowodzeniem.
Nie jest wygodne utrzymywanie JSON w takim formacie. Czy istnieje obejście pozwalające pozbyć się wielowątkowej struktury JSON lub przekonwertować ją w onelinera?
Opcja "wielowierszowa" sprawdziła się u mnie. Dzięki Dan! – Omkar