Примечание : это НЕ дубликат следующих (или нескольких других аналогичных обсуждений)
У меня есть таблица Hive
, которую я должен прочитать, и обрабатывать чисто с помощью Spark
-SQL-запроса .В этой таблице есть столбец string
, который содержит JSON
дампов из API ;как и ожидалось, он имеет глубоко вложенных строковых JSON .
Давайте возьмем этот пример (он отображает точную глубину / сложность данных, которые я пытаюсь обработать)
{
"key1": ..
"key2": ..
..
"bill_summary": {
"key1": ..
"key2": ..
..
"items": [
{
"item": {
"key1": ..
"key2": ..
..
"type": "item_type_1"
..
"total_cost": 57.65
..
}
},
{
"item": {
"key1": ..
"key2": ..
..
"total_cost": 23.31
..
}
}
..
{
"item": {
"key1": ..
"key2": ..
..
"type": "item_type_1"
..
}
}
]
..
}
..
}
Меня интересует массив items
.Я могу получить к нему доступ через
get_json_object(get_json_object('$.bill_summary'), '$.items') AS items
Теперь вот проблема
- Мне нужно вынуть все (
type
, total_cost
) кортежи из массива - Но мне нужны только те записи, где присутствуют оба, в то время как несколько
item
объектов имеют один из них или ни одного из них
- Пока яТакже удалось отдельно выбрать все
type
поля и total_cost
поля в два отдельных массива , но из-за второго ограничения, указанного выше (отсутствующие поля), я в итоге потерял связь . - В итоге я получаю (используя следующий фрагмент) два массива (возможно, разной длины), но не уверен, что соответствующие элементы каждого массива принадлежат одному и тому же элементу или нет
этот фрагмент содержит только часть моего довольно длинного SQL-запроса.Он использует CTE
..
split(get_json_object(get_json_object(var6, '$.bill_summary'), '$.items[*].item.type'), ',') AS types_array,
split(get_json_object(get_json_object(var6, '$.bill_summary'), '$.items[*].item.total_cost'), ',') AS total_cost_array
..
Теперь вот ограничения
- У меня нет контроля над источником
Hive
схема таблицы илиего данные - Я хочу сделать это, используя чисто
Spark
SQL-запрос - Я не могу использовать
DataFrame
манипулирование - Я не хочу использовать зарегистрированных
udf
(я сохраняю это в качестве крайней меры)
Я провел несколько часов в документахи форумы, но документы Spark-SQL редки и обсуждения в основном вращаются вокруг DataFrame
API, который я не могу использовать.Решена ли эта проблема даже одним SQL-запросом?