Необходимо вытащить Json данных (вложенный массив) из одного фрейма данных столбца - таблица выводится как Null при чтении схемы - Scala - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь извлечь данные, как показано ниже, из фрейма данных. Данные Json, которые имеют вложенные массивы, полностью находятся в одном столбце (_c1). Я хочу вытащить его и создать как отдельный фрейм данных с действительными именами столбцов. Один образец записи будет таким, как показано ниже.

|_c1                                                                                                                                                                                                                                                                                                                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|{"Id":"31279605299","Type":"12121212","client":"Checklist _API","eventTime":"2020-03-17T15:50:30.640Z","eventType":"Event","payload":{"sourceApp":"ios","questionnaire":{"version":"1.0","question":"How to resolve ? ","fb":"Na"}}} 

Я читаю его в схему как,

val schema=StructType(Array(
      StructField("Id", StringType, false),
      StructField("Type", StringType, false),
      StructField("client", StringType, false),
      StructField("eventTime", StringType, false),
      StructField("eventType", StringType, false),
      StructField("payload", ArrayType(StructType(Array(
        StructField("sourceApp", StringType, false),
        StructField("questionnaire", ArrayType(StructType(Array(
          StructField("version", StringType, false),
          StructField("question", StringType, false),
          StructField("fb", StringType, false)))))
      ))))
    ))

      val json_paral = DF.select(from_json(col("_c1"),schema))
`
Structure comes out as below,
`

 |-- jsontostructs(_c1): struct (nullable = true)
 |    |-- Id: string (nullable = true)
 |    |-- Type: string (nullable = true)
 |    |-- client: string (nullable = true)
 |    |-- eventTime: string (nullable = true)
 |    |-- eventType: string (nullable = true)
 |    |-- payload: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- sourceApp: string (nullable = true)
 |    |    |    |-- questionnaire: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- version: string (nullable = true)
 |    |    |    |    |    |-- question: string (nullable = true)
 |    |    |    |    |    |-- fb: string (nullable = true)

Структура хороша, но когда я проверяю фрейм данных, все данные выходят как NULL. Читается нормально? Нет проблем с синтаксическим анализом.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вместо того, чтобы считывать его в схему, я попытался сделать его значением как


val Df = json_DF.map(r => r.getString(0))

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

val g1DF=spark.read.json(Df)

Произошло ли разнесение некоторого бокового обзора вложенными, чтобы вытащить значения вложенных массивов.

0 голосов
/ 28 мая 2020

Пожалуйста, проверьте, помогает ли это -

1. Загрузите данные

val data = """{"Id":"31279605299","Type":"12121212","client":"Checklist _API","eventTime":"2020-03-17T15:50:30.640Z","eventType":"Event","payload":{"sourceApp":"ios","questionnaire":{"version":"1.0","question":"How to resolve ? ","fb":"Na"}}} """

    val df = Seq(data).toDF("jsonCol")
    df.show(false)
    df.printSchema()

Output-

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|jsonCol                                                                                                                                                                                                                              |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|{"Id":"31279605299","Type":"12121212","client":"Checklist _API","eventTime":"2020-03-17T15:50:30.640Z","eventType":"Event","payload":{"sourceApp":"ios","questionnaire":{"version":"1.0","question":"How to resolve ? ","fb":"Na"}}} |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

root
 |-- jsonCol: string (nullable = true)

2. извлеките строку json для разделения полей

 df.select(json_tuple(col("jsonCol"), "Id", "Type", "client", "eventTime", "eventType", "payload"))
      .show(false)

Output-

+-----------+--------+--------------+------------------------+-----+----------------------------------------------------------------------------------------------+
|c0         |c1      |c2            |c3                      |c4   |c5                                                                                            |
+-----------+--------+--------------+------------------------+-----+----------------------------------------------------------------------------------------------+
|31279605299|12121212|Checklist _API|2020-03-17T15:50:30.640Z|Event|{"sourceApp":"ios","questionnaire":{"version":"1.0","question":"How to resolve ? ","fb":"Na"}}|
+-----------+--------+--------------+------------------------+-----+----------------------------------------------------------------------------------------------+

3. используя from_json(..)

val processed = df.select(
      expr("from_json(jsonCol, 'struct<Id:string,Type:string,client:string,eventTime:string, eventType:string," +
      "payload:struct<questionnaire:struct<fb:string,question:string,version:string>,sourceApp:string>>')")
        .as("json_converted"))
      processed.show(false)
      processed.printSchema()

Выход-

+-------------------------------------------------------------------------------------------------------------+
|json_converted                                                                                               |
+-------------------------------------------------------------------------------------------------------------+
|[31279605299, 12121212, Checklist _API, 2020-03-17T15:50:30.640Z, Event, [[Na, How to resolve ? , 1.0], ios]]|
+-------------------------------------------------------------------------------------------------------------+

root
 |-- json_converted: struct (nullable = true)
 |    |-- Id: string (nullable = true)
 |    |-- Type: string (nullable = true)
 |    |-- client: string (nullable = true)
 |    |-- eventTime: string (nullable = true)
 |    |-- eventType: string (nullable = true)
 |    |-- payload: struct (nullable = true)
 |    |    |-- questionnaire: struct (nullable = true)
 |    |    |    |-- fb: string (nullable = true)
 |    |    |    |-- question: string (nullable = true)
 |    |    |    |-- version: string (nullable = true)
 |    |    |-- sourceApp: string (nullable = true)

...