Как разобрать строку json в разных столбцах в spark scala? - PullRequest
2 голосов
/ 12 апреля 2020

При чтении файла партера это следующие данные файла

|id |name |activegroup|

|1  |abc  |[{"groupID":"5d","role":"admin","status":"A"},{"groupID":"58","role":"admin","status":"A"}]|

типы данных каждого поля

root

|--id : int
|--name : String
|--activegroup : String

столбец активной группы - строка разнесение функция не работает. Ниже приведен требуемый вывод

|id |name |groupID|role|status|
|1  |abc  |5d     |admin|A    |
|1  |def  |58     |admin|A    |

Помогите мне с разбором выше в spark scala последняя версия

1 Ответ

3 голосов
/ 12 апреля 2020

Сначала вам нужно извлечь схему json:

  val schema = schema_of_json(lit(df.select($"activeGroup").as[String].first))

Получив ее, вы можете преобразовать столбец вашей активной группы, который является строкой, в json (from_json), и затем explode it.

Если столбец равен json, вы можете извлечь его значения с помощью $"columnName.field"

  val dfresult = df.withColumn("jsonColumn", explode(
                                      from_json($"activegroup", schema)))
                   .select($"id", $"name",
                           $"jsonColumn.groupId" as "groupId", 
                           $"jsonColumn.role" as "role", 
                           $"jsonColumn.status" as "status")

Если вы хотите извлечь целое json и с именами элементов все в порядке, вы можете использовать *, чтобы сделать это:

val dfresult = df.withColumn("jsonColumn", explode(
                               from_json($"activegroup", schema)))
            .select($"id", $"name", $"jsonColumn.*")

РЕЗУЛЬТАТ

+---+----+-------+-----+------+
| id|name|groupId| role|status|
+---+----+-------+-----+------+
|  1| abc|     5d|admin|     A|
|  1| abc|     58|admin|     A|
+---+----+-------+-----+------+
...