Как выбрать поле JSON, содержащееся в массиве

#arrays #json #scala #dataframe #apache-spark-sql

#массивы #json #scala #фрейм данных #apache-spark-sql

Вопрос:

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

 |-- payload: struct (nullable = true)
 |    |-- detail: struct (nullable = true)
 |    |    |-- data: struct (nullable = true)
 |    |    |    |-- object: struct (nullable = true)
 |    |    |    |    |-- items: struct (nullable = true)
 |    |    |    |    |    |-- data: array (nullable = true)
 |    |    |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |    |    |-- billing_thresholds: string (nullable = true)
 |    |    |    |    |    |    |    |-- created: long (nullable = true)
 |    |    |    |    |    |    |    |-- id: string (nullable = true)
 |    |    |    |    |    |    |    |-- object: string (nullable = true)
 |    |    |    |    |    |    |    |-- plan: struct (nullable = true)
 |    |    |    |    |    |    |    |    |-- amount: long (nullable = true)             
 

Я знаю, что могу сделать что-то подобное, что даст мне нужное мне поле:

 display(sT_customer_subscription_events
        .select($"payload.detail.data.object.items.data".getItems(0) as "item_data")
        .select($"item_data.plan.amount"
)
 

Но я пытаюсь сделать это в рамках первого оператора select, это не работает для меня ниже

 display(sT_customer_subscription_events.select($"payload.detail.data.object.items.data".getItems(0)."plan.month" )
 

Ответ №1:

С помощью этого запроса:

 originalDF.withColumn("plan",
  from_json($"strJson", schema))
    .select($"plan.payload.detail.data.object.items.data"
      .getItem(0)
        .getField("plan")
          .getField("amount")).show()
 

Я получаю результат:

  ------------------------------------------------------------------- 
|plan.payload.detail.data.object.items.data AS `data`[0].plan.amount|
 ------------------------------------------------------------------- 
|                                                                  0|
 ------------------------------------------------------------------- 
 

Проверьте это