Извлечение массива из varchar в PrestoSQL

#sql #presto

Вопрос:

У меня есть поле VARCHAR, подобное этому:

 [
  {
    "config": 0,
    "type": "0
  },
  {
    "config": x,
    "type": "1"
  },
  {
    "config": "",
    "type": ""
  },
  {
    "config": [
      {
        "address": {},
        "category": "",
        "merchant": {
          "data": [
            10,12,23
          ],
          "file": 0
        },
        "range_id": 1,
        "shop_id_info": null
      }
    ],
    "type": "new"
  }
]
 

И мне нужно извлечь из этого данные о продавцах. Желаемым результатом является:

10

12

23

Пожалуйста, посоветуйте. Я продолжаю получать Не могу привести VARCHAR к типу массива/unnest VARCHAR

Ответ №1:

Вы можете попробовать использовать путь json $.*.config.*.merchant.data.* , но если это не работает для вас (как для меня в версии Athena, где массивы в пути json не поддерживаются должным образом), вы можете привести свой json в ARRAY(JSON) и выполнить некоторые манипуляции оттуда (необходимо немного исправить ваш JSON).:

Данные испытаний:

 WITH dataset AS (
    SELECT * FROM (VALUES   
        (JSON '[
  {
    "config": {},
    "type": "0"
  },
  {
    "config": "x",
    "type": "1"
  },
  {
    "config": "",
    "type": ""
  },
  {
    "config": [
      {
        "address": {},
        "category": "",
        "merchant": {
          "data": [
            10,12,23
          ],
          "file": 0
        },
        "range_id": 1,
        "shop_id_info": null
      }
    ],
    "type": "new"
  }
]')
        
 ) AS t (json_value))
 

И запрос:

 SELECT flatten(
    transform(
        flatten(
            transform(
                CAST(json_value AS ARRAY(JSON))
                , json_object -> try(CAST(json_extract(json_object, '$.config') AS ARRAY(JSON))))),
        json_config -> CAST(json_extract(json_config, '$.merchant.data') as ARRAY(INTEGER))))
FROM dataset
 

Что даст вам массив чисел:

_col0
[10, 12, 23]

И оттуда вы можете продолжить с unnest и так далее, если это необходимо.

Комментарии:

1. @itsmethubui был рад помочь!