Как взорвать строку json на несколько строк в искре? - PullRequest
0 голосов
/ 30 января 2020

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

Я использую spark 2.4, а вот исходный кадр данных:

+------+---------------------------------------------------------------------------------------------------------------------------+
|userId|values                                                                                                                     
|
+------+---------------------------------------------------------------------------------------------------------------------------+
|1     |[{"mouseCode":0,"target":"TR#test-15110>TD>DIV>SPAN>LABEL"},{"keyCode":96,"target":"INPUT#next-button[value='Save Data']"}]|
|2     |[{"keyCode":53,"target":"TR#box-15110>TD>DIV>SPAN>LABEL"}]                                                                 |
+------+---------------------------------------------------------------------------------------------------------------------------+

Я бы например, результирующий фрейм данных выглядит следующим образом:

+------+---------------------------------------------------------------------------------------------------------------------------+
|userId|values                                                                                                                     
|
+------+---------------------------------------------------------------------------------------------------------------------------+
|1     |{"mouseCode":0,"target":"TR#test-15110>TD>DIV>SPAN>LABEL"}|
|1     |{"keyCode":96,"target":"INPUT#next-button[value='Save Data']"}|
|2     |{"keyCode":53,"target":"TR#box-15110>TD>DIV>SPAN>LABEL"}                                                                 |
+------+---------------------------------------------------------------------------------------------------------------------------+

Итак, это взрыв, когда мы не знаем, сколько возможных значений может существовать, но схема фрейма исходных данных выглядит следующим образом:

root
|-- userId: integer (nullable = false)
|-- values: string (nullable = true)

df.select(explode($"values").as("explodedValues"))

Поскольку это строка, она не будет работать, поскольку не знает, как ее разбить. Итак, я думаю, мне нужно преобразовать его в список / массив этих объектов? Я попытался создать UDF, который разделяется на «[}, {]», но вместо этого он разделяется на каждую запятую.

Любая помощь или руководство в правильном направлении очень ценится. Спасибо.

1 Ответ

1 голос
/ 30 января 2020

Вам не нужен udf для этого, просто сделайте это так:

yourDF.withColumn("newValues", explode(split(regexp_replace($"values", "\\[|\\]", ""), ","))).drop("values")
.show(false)

Или чтобы убедиться, что в строке нет запятых, просто удвойте вьющиеся скобки, как это и после этого разбивайте строку после каждой пары "}, {".

df2.withColumn("newValues", explode(split(regexp_replace(regexp_replace($"values", "\\[|\\]", ""), "},\\{", "}},\\{\\{"), "},\\{"))).drop("values")
.show(false)

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

Я надеюсь, что это помогает тебе.

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