Есть ли общий способ прочитать многострочный JSON в искре. Точнее искра? - PullRequest
0 голосов
/ 16 января 2019

У меня есть несколько строк JSON, как это

{"_id": {"$ oid": "50b59cd75bed76f46522c34e"}, "student_id": 0, "class_id": 2, "scores": [{"type": "exam", "score": 57.92947112575566 }, {"type": "quiz", "score": 21.24542588206755}, {"type": "homework", "Score": 68.19567810587429}, {"type": "homework", "score": 67.95019716560351}, {"тип": "домашняя работа", "оценка": 18.81037253352722}]}

Это всего лишь 1 строка от json. И есть и другие файлы. Я ищу способ прочитать этот файл в pyspark / spark. Может ли он быть независимым от формата JSON?

Мне нужен вывод в виде «показателей» в виде отдельного столбца, например, Scores_exam должен быть один столбец со значением 57,92947112575566, Score_quiz другой столбец со значением 21,24542588206755.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 16 января 2019

YES.

Использовать многострочное значение true

from pyspark.sql.functions import explode, col

val df = spark.read.option("multiline", "true").json("multi.json")

Вы получаете ниже вывода.

+--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------+
|_id                       |class_id|scores                                                                                                                                            |student_id|
+--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------+
|[50b59cd75bed76f46522c34e]|2       |[[57.92947112575566, exam], [21.24542588206755, quiz], [68.1956781058743, homework], [67.95019716560351, homework], [18.81037253352722, homework]]|0         |
+--------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------+

Добавьте эти строки, чтобы получить

  val df2= df.withColumn("scores",explode(col("scores")))
      .select(col("_id.*"), col("class_id"),col("scores.*"),col("student_id"))

+------------------------+--------+-----------------+--------+----------+
|$oid                    |class_id|score            |type    |student_id|
+------------------------+--------+-----------------+--------+----------+
|50b59cd75bed76f46522c34e|2       |57.92947112575566|exam    |0         |
|50b59cd75bed76f46522c34e|2       |21.24542588206755|quiz    |0         |
|50b59cd75bed76f46522c34e|2       |68.1956781058743 |homework|0         |
|50b59cd75bed76f46522c34e|2       |67.95019716560351|homework|0         |
|50b59cd75bed76f46522c34e|2       |18.81037253352722|homework|0         |
+------------------------+--------+-----------------+--------+----------+

Обратите внимание, что мы используем функции "col" и "explode" из spark, поэтому вам необходимо выполнить следующий импорт, чтобы эти функции работали.

из pyspark.sql.functions import explode, столбец

Подробнее о том, как анализировать файл JSON с помощью многострочного текста, можно узнать ниже.

https://docs.databricks.com/spark/latest/data-sources/read-json.html

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...