从 PrestoSQL 中的 varchar 中提取数组

Extract array from varchar in PrestoSQL

我有一个像这样的 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

请指教。我不断收到 Cannot cast VARCHAR to array/unnest type VARCHAR

您可以尝试使用 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 等。