Redshift Postgresql - 如何解析嵌套的 JSON
Posted
技术标签:
【中文标题】Redshift Postgresql - 如何解析嵌套的 JSON【英文标题】:Redshift Postgresql - How to Parse Nested JSON 【发布时间】:2020-02-10 22:47:20 【问题描述】:我正在尝试使用 JSON_EXTRACT_PATH_TEXT() 函数解析 JSON 文本。 JSON 示例:
"data":[
"name":"ping",
"idx":0,
"cnt":27,
"min":16,
"max":33,
"avg":24.67,
"dev":5.05
,
"name":"late",
"idx":0,
"cnt":27,
"min":8,
"max":17,
"avg":12.59,
"dev":2.63
]
'
我尝试了 JSON_EXTRACT_PATH_TEXT(event , '"name":"late"', 'avg') 函数来获取 name = "late" 的 'avg',但它返回空白。 有人可以帮忙吗? 谢谢
【问题讨论】:
【参考方案1】:在 Redshift 中这是一项相当复杂的任务,与 Postgres 不同的是,它具有 poor support to manage JSON,并且没有取消嵌套数组的功能。
这是使用数字表的一种方法;您需要使用从0
开始的递增数字填充表格,例如:
create table nums as
select 0 i union all select 1 union all select 2 union all select 3
union all select 4 union all select 5 n union all select 6
union all select 7 union all select 8 union all select 9
;
创建表后,您可以使用它使用json_extract_array_element_text()
遍历JSON 数组,并使用json_extract_path_text()
检查其内容:
select json_extract_path_text(item, 'avg') as my_avg
from (
select json_extract_array_element_text(t.items, n.i, true) as item
from (
select json_extract_path_text(mycol, 'data', true ) as items
from mytable
) t
inner join nums n on n.i < json_array_length(t.items, true)
) t
where json_extract_path_text(item, 'name') = 'late';
【讨论】:
【参考方案2】:您需要为此使用json_array_elements
:
select obj->'avg'
from foo f, json_array_elements(f.event->'data') obj
where obj->>'name' = 'late';
Working example
create table foo (id int, event json);
insert into foo values (1,'
"data":[
"name":"ping",
"idx":0,
"cnt":27,
"min":16,
"max":33,
"avg":24.67,
"dev":5.05
,
"name":"late",
"idx":0,
"cnt":27,
"min":8,
"max":17,
"avg":12.59,
"dev":2.63
]');
【讨论】:
以上是关于Redshift Postgresql - 如何解析嵌套的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Redshift Postgresql - 如何解析嵌套的 JSON
使用 Redshift (PostgreSQL) 和计数的数据透视表
如何在 Kafka 中进行转换(PostgreSQL-> Red shift )
redshift/Postgresql 8.0 撤销连接到用户的数据库
如何使用 pandas 或 python 将具有数百万行的表从 PostgreSQL 复制到 Amazon Redshift