Обработка вложенной структуры Json

предположим, что у нас есть следующая структура json:

{
    "positions": {
        "node": "abc"
    }
    "submissions" :{
        "submissionOffsets":[
        {
            "attributeName": "sample1",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample2",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample3",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample4",
            "attributeValue": 1224
        }
        
    }
}

и мы хотим прочитать «submissionOffsets» и извлечь attributeName и attributeValue на основе имени атрибута, например «sample1», и ожидаемая структура должна быть в случае Match

{
    "positions": {
        "node": "abc"
    }
    "submissions" :{
        "submissionOffsets":[
        {
            "attributeName": "sample1",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample2",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample3",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample4",
            "attributeValue": 1224
        }
        
    },
"attributeName": "sample1",
"attributeValue": 1224
}


**Incase of No Match**

{
    "positions": {
        "node": "abc"
    }
    "submissions" :{
        "submissionOffsets":[
        {
            "attributeName": "sample1",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample2",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample3",
            "attributeValue": 1224
        },
        {
            "attributeName": "sample4",
            "attributeValue": 1224
        }
        
    },
"attributeName": null,
"attributeValue": 0.00
}

Это должно быть сделано в кадрах данных

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

Вы забыли опубликовать свою попытку решить эту проблему.

Scott Hunter 08.08.2023 14:23

Если какое-либо свойство json содержит null, искра будет удалена и не будет доступна в вашем конечном результате.

Srinivas 08.08.2023 17:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

filter функция высшего порядка для фильтрации определенного атрибута из вложенного массива json.

inline или inline_outer - чтобы взорвать значения массива.

Ниже приведен пример кода

scala> val df = spark
.read
.option("multiLine", "true")
.json(Seq(data).toDS)

df: org.apache.spark.sql.DataFrame = [positions: struct<node: string>, submissions: struct<submissionOffsets: array<struct<attributeName:string,attributeValue:bigint>>>]

scala> df.show(false)
+---------+----------------------------------------------------------------------+
|positions|submissions                                                           |
+---------+----------------------------------------------------------------------+
|{abc}    |{[{sample1, 1224}, {sample2, 1224}, {sample3, 1224}, {sample4, 1224}]}|
+---------+----------------------------------------------------------------------+


scala> df.printSchema
root
 |-- positions: struct (nullable = true)
 |    |-- node: string (nullable = true)
 |-- submissions: struct (nullable = true)
 |    |-- submissionOffsets: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- attributeName: string (nullable = true)
 |    |    |    |-- attributeValue: long (nullable = true)


scala> 
// filter higher order function to filter nested json array values / attributes
// inline_outer is to explode array values

df
.selectExpr(
    "*", // to select all columns from the dataset / dataframe
    "inline_outer(filter(submissions.submissionOffsets, i -> i.attributeName == 'sample1')) as (attributeName, attributeValue)"
)
.toJSON.show(false)
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|value                                                                                                                                                                                                                                                                                                                     |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|{"positions":{"node":"abc"},"submissions":{"submissionOffsets":[{"attributeName":"sample1","attributeValue":1224},{"attributeName":"sample2","attributeValue":1224},{"attributeName":"sample3","attributeValue":1224},{"attributeName":"sample4","attributeValue":1224}]},"attributeName":"sample1","attributeValue":1224}|
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Спасибо, это работает, но можем ли мы внести некоторые изменения, чтобы он возвращал остальные наборы данных в случае совпадения?

ravish kumar 08.08.2023 15:18

Я не понял тебя. не могли бы вы обновить свой вопрос с ожидаемым результатом в случае несоответствия?

Srinivas 08.08.2023 15:41

Давайте предположим, если я изменю критерии фильтра на sample5 df .selectExpr("*", // для выбора всех столбцов из набора данных/dataframe "inline(filter(submissions.submissionOffsets, i -> i.attributeName == 'sample5')) as (attributeName, attributeValue)" ) Затем я ожидаю, что значения возвращенных позиций и затем представлений, а затем attrbuteName и attrbuteValue будут пустыми, но позиции и представления должны иметь такие значения, как есть

ravish kumar 08.08.2023 16:02

понятно. В случае, если фильтр не соответствует, какие будут значения по умолчанию для attributeName и attributeValue?

Srinivas 08.08.2023 16:09

обновленный код. добавлена ​​функция inline_outer для сохранения структуры в случае несоответствия фильтра.

Srinivas 08.08.2023 16:18

Спасибо, это работает, как мы можем обновить значения как 0 вместо нуля

ravish kumar 08.08.2023 16:32

хорошо, если получится. не могли бы вы принять решение и отметить его как правильный ответ?

Srinivas 08.08.2023 16:38

да, конечно, можете ли вы помочь мне заполнить 0 вместо нуля в attributeName и attributeValue

ravish kumar 08.08.2023 16:41

конечно, не могли бы вы обновить свой вопрос с помощью приведенного выше варианта использования?

Srinivas 08.08.2023 16:43

вы имеете в виду новый вопрос?

ravish kumar 08.08.2023 16:45

нет, в этом вопросе только ниже вы можете добавить вышеуказанный вариант использования.

Srinivas 08.08.2023 16:49

Обновленный вопрос

ravish kumar 08.08.2023 16:56

Другие вопросы по теме