#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|
-------------------------------------------------------------------
Проверьте это