Запрос на извлечение идентификаторов из глубоко вложенного объекта массива json в Presto - PullRequest
0 голосов
/ 14 мая 2019

Я использую Presto и пытаюсь извлечь все 'id' из 'source' = 'dd' из вложенной структуры json следующим образом.

{
  "results": [
    {
      "docs": [
        {
          "id": "apple1",
          "source": "dd"
        },
        {
          "id": "apple2",
          "source": "aa"
        },
        {
          "id": "apple3",
          "source": "dd"
        }
      ],
      "group": 99806
    }
  ]
}

ожидается извлечение идентификаторов [apple1, apple3] в столбец в Presto Мне интересно, как правильно добиться этого в Presto Query?

1 Ответ

2 голосов
/ 14 мая 2019

Если ваши данные имеют регулярную структуру, как в примере, который вы опубликовали, вы можете использовать комбинацию для анализа значения как JSON , приведение его к структурированному типу SQL (массив / карта / строка) ииспользование функций обработки массива до фильтра , преобразования и извлечения нужных элементов:

WITH data(value) AS (VALUES '{
  "results": [
    {
      "docs": [
        {
          "id": "apple1",
          "source": "dd"
        },
        {
          "id": "apple2",
          "source": "aa"
        },
        {
          "id": "apple3",
          "source": "dd"
        }
      ],
      "group": 99806
    }
  ]
}'),
parsed(value) AS (
  SELECT cast(json_parse(value) AS row(results array(row(docs array(row(id varchar, source varchar)), "group" bigint))))
  FROM data
)
SELECT 
  transform(                                        -- extract the id from the resulting docs
    filter(                                         -- filter docs with source = 'dd'
        flatten(                                    -- flatten all docs arrays into a single doc array
             transform(value.results, r -> r.docs)  -- extract the docs arrays from the result array
        ),
        doc -> doc.source = 'dd'),
    doc -> doc.id)
FROM parsed

Приведенный выше запрос приводит к:

      _col0
------------------
 [apple1, apple3]
(1 row)
...