Разбор файла JSON определенного формата Struct of Array of Structs в искровой фрейм данных - PullRequest
0 голосов
/ 25 июня 2018

Мой Json:

{"apps": {"app": [{"id": "id1","user": "hdfs"}, {"id": "id2","user": "yarn"}]}}

Схема:

root 
|-- apps: struct (nullable = true) 
| |-- app: array (nullable = true) 
| | |-- element: struct (containsNull = true) 
| | | |-- id: String (nullable = true) 
| | | |-- name: String (nullable = true)

Мой код:

StructType schema = new StructType()
                .add("apps",(new StructType()
                .add("app",(new StructType()))
                .add("element",new StructType().add("id",new StringType())add("user",new StringType())
                        )));
Dataset<Row> df = sparkSession.read().schema(schema).json(<path_to_json>);

Это дает мне эту ошибку:

Exception in thread "main" scala.MatchError: org.apache.spark.sql.types.StringType@1fca53a7 (of class org.apache.spark.sql.types.StringType)

df.show() должен показать мне:

id  user
id1 hdfs
id2 yarn

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

@ Сайду ответ правильный.Хотя spark выведет схему автоматически, но желательно предоставить схему явно.В этом сценарии это будет работать, так как оба типа являются строковыми.Возьмите пример, где первое значение id является целым числом.Так что в инфершеме это будет считаться длинным.

0 голосов
/ 25 июня 2018

Вам не нужно указывать схему при чтении данных, Spark может вывести схему автоматически.Однако, чтобы получить требуемый вывод, необходимы некоторые манипуляции.

Сначала прочитайте данные:

Dataset<Row> df = sparkSession.read().json("<path_to_json>");

Используйте explode, чтобы поместить каждый элемент Array в свою собственную строку, затем используйтеselect для распаковки данных в отдельные столбцы.

df.withColumn("app", explode($"apps.app"))
  .select("app.*")

Это должно дать вам фрейм данных в ожидаемом формате.

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