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

时间:2015-09-09 11:37:17

标签: jsonpath presto

我使用最新的(0.117)Presto并尝试使用复杂的JSON数组执行 CROSS JOIN UNNEST

[{"id": 1, "value":"xxx"}, {"id":2, "value":"yy"}, ...]

要做到这一点,首先我尝试使用 id 的值

来制作 ARRAY

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

但它没有用。

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

4 个答案:

答案 0 :(得分: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)

输出是:

    [12, 14]

答案 1 :(得分:5)

您可以将JSON转换为MAP的ARRAY,并使用transform lambda函数来提取&#34; id&#34;键:

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)

输出:

 [1, 2]

答案 2 :(得分:3)

这将解决您的问题。它更通用地转换为json的ARRAY(在给定任意映射结构的情况下不易出错):

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)

presto中的输出:

 [1,2]

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

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

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

答案 3 :(得分:1)

我终于放弃了一个简单的JSON路径来提取它们。

相反,我编写了一个冗余的脏查询,如下所示,以完成任务。

SELECT
  ...
FROM
  (
    SELECT
      SLICE(ARRAY[
        JSON_EXTRACT(json_column, '$[0].id'),
        JSON_EXTRACT(json_column, '$[1].id'),
        JSON_EXTRACT(json_column, '$[2].id'),
        ...
      ], JSON_ARRAY_LENGTH(json_column)) ids
    FROM
     the.table
  ) t1
  CROSS JOIN UNNEST(ids) AS t2(id)
WHERE
  ...

如果您知道 CROSS JOIN 的另一种好方法,我仍然想知道最佳做法!