从 Presto 中的 JSON 数组中提取值

Posted

技术标签:

【中文标题】从 Presto 中的 JSON 数组中提取值【英文标题】:Extract values from a JSON Array in Presto 【发布时间】:2021-05-06 23:43:46 【问题描述】:

我有一列包含如下 JSON 数组:

data=["name":"col1","min":0,"max":32,"avg":29,
"name":"col2","min":1,"max":35,"avg":21,
"name":"col3","min":4,"max":56,"avg":34]

我正在尝试解析数组并根据条件提取特定值。例如

"min" 的值,其中"name"="col1":0

"avg" 的值,其中"name"="col3":34

有没有人可以解决这个问题?

【问题讨论】:

【参考方案1】:

您的 JSON 无效。应该是"data":[ 而不是data = [

如果 JSON 有效(您可以在子查询中轻松修复它),提取数据,将其转换为数组(行)并使用 CASE 表达式获取值。我在此处添加了 max() 聚合以删除 NULL 记录并在单行中获取所有必需的值,您可以使用过滤器代替(例如 where x.name = 'col1'),具体取决于您的需要:

with mydata as (
select '"data":["name":"col1","min":0,"max":32,"avg":29,
"name":"col2","min":1,"max":35,"avg":21,
"name":"col3","min":4,"max":56,"avg":34]' json
)

select max(case when x.name = 'col1' then x.min end) min_col1,
       max(case when x.name = 'col3' then x.avg end) avg_col3
from mydata
CROSS JOIN
    UNNEST(
            CAST(
                JSON_EXTRACT(json,'$.data')
                    as ARRAY(ROW(name VARCHAR, min INTEGER, max INTEGER, avg INTEGER))
                 )
          ) as x(name, min, max, avg) --column aliases

结果:

min_col1    avg_col3
0           34

【讨论】:

以上是关于从 Presto 中的 JSON 数组中提取值的主要内容,如果未能解决你的问题,请参考以下文章

遇到的问题--presto---提取json中的数组值为null

使用 Google BigQuery 从 JSON 中的多个属性值中提取值

jmeter中json提取器和断言器的简单用法

从spark中的json中的数组中提取Json

如何从嵌套的 json 值中提取特定值。?

如何在JSON.NET中读取json对象值中的long值数组