如何在Presto中的嵌套json数组对象中提取键?

k-k*_*awa 14 jsonpath presto

我正在使用最新的(0.117)Presto并试图用这样复杂的JSON数组执行CROSS JOIN UNNEST.

[{"id": 1, "value":"xxx"}, {"id":2, "value":"yy"}, ...]
Run Code Online (Sandbox Code Playgroud)

为此,首先我尝试使用id by 的值创建一个ARRAY

SELECT CAST(JSON_EXTRACT('[{"id": 1, "value":"xxx"}, {"id":2, "value":"yy"}]', '$..id') AS ARRAY<BIGINT>)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

提取id值的最佳JSON路径是什么?

小智 7

您可以将JSON转换为MAP的ARRAY,并使用transformlambda函数提取"id"键:

select 
        TRANSFORM(CAST(JSON_PARSE(arr1) AS ARRAY<MAP<VARCHAR, VARCHAR>>), entry->entry['id'])
from 
       (values ('[{"id": 1, "value":"xxx"}, {"id":2, "value":"yy"}]')) t(arr1)
Run Code Online (Sandbox Code Playgroud)

输出:

 [1, 2]
Run Code Online (Sandbox Code Playgroud)


aar*_*han 5

现在,你可以使用presto-third-functions,它提供json_array_extract函数,你可以像这样提取json数组信息:

    select 
           json_array_extract_scalar(arr1, '$.book.id') 
    from 
           (values ('[{"book":{"id":"12"}}, {"book":{"id":"14"}}]')) t(arr1)
Run Code Online (Sandbox Code Playgroud)

输出是:

    [12, 14]
Run Code Online (Sandbox Code Playgroud)


小智 5

这样可以解决您的问题。它更通用地转换为json的数组(由于任意映射结构,不太容易出错):

select 
        TRANSFORM(CAST(JSON_PARSE(arr1) AS ARRAY<JSON>), 
                   x -> JSON_EXTRACT_SCALAR(x, '$.id'))
from 
       (values ('[{"id": 1, "value":"xxx"}, {"id":2, "value":"yy"}]')) t(arr1)
Run Code Online (Sandbox Code Playgroud)

预先输出:

 [1,2]
Run Code Online (Sandbox Code Playgroud)

...我遇到了一种情况,其中json列表嵌套在json中。我的json列表有一个模糊的嵌套映射结构。以下代码在json列表中返回给定特定键的值数组。

  1. 使用JSON EXTRACT提取列表
  2. 将列表转换为jsons数组
  3. 使用TRANSFORM函数循环遍历数组中的json元素,并提取您感兴趣的键的值。

>

TRANSFORM(CAST(JSON_EXTRACT(json, '$.path.toListOfJSONs') AS ARRAY<JSON>),
          x -> JSON_EXTRACT_SCALAR(x, '$.id')) as id
Run Code Online (Sandbox Code Playgroud)