2014-10-28 26 views
8

查询JSON领域我们计划尽快开始使用红移,我们的字段(列)中的一个是一个JSON值。它是一个平JSON(根据定义,即没有嵌套水平)和我们必须使用JSON的原因在于,每个记录具有不同数目的不同键值的元素,其可以非常从0至10或更多(所以我不能使用每对的字段等)。在红移

例如,这些领域可能是{ “键1”: “值1”, “KEY2”: “值2”,......, “KEY5”: “值5”}

我想查询和统计具有某个特定关键字的所有记录,并可能按值分组。在上面的例子中,我希望像“select count(*)where field key'key1'group by value”。

的值是否JSON内红移支持查询?这怎么能实现呢?

回答

7

你有没有尝试使用红移的JSON_EXTRACT_PATH_TEXT功能?

+0

只见那,不知道是否能回答我的要求,我是否可以在where子句中使用它(由于技术原因,我还没有动手一个RS DB)。 – user2339344 2014-10-28 19:30:57

14

是,亚马逊红移支持与“JSON_EXTRACT_PATH_TEXT”功能的列中解析JSON字符串,你可以调用这个函数即使在BY子句条款或组。最好看下面的例子来理解它是如何工作的。

db=> create table json_test (id int primary key, json text); 
db=> insert into json_test values (1, '{"key1":1, "key2":"a"}'); 
db=> insert into json_test values (2, '{"key1":2, "key2":"b"}'); 
db=> insert into json_test values (3, '{"key1":3, "key2":"a"}'); 
db=> insert into json_test values (4, '{"key3":0}'); 
db=> select * from json_test order by id; 
id |   json 
----+------------------------ 
    1 | {"key1":1, "key2":"a"} 
    2 | {"key1":2, "key2":"b"} 
    3 | {"key1":3, "key2":"a"} 
    4 | {"key3":0} 
(4 rows) 


-- In select list 
db=> select json_extract_path_text(json, 'key2') as key2 from json_test where id = 1; 
key2 
------ 
a 
(1 row) 


-- Where clause 
db=> select * from json_test where json_extract_path_text(json, 'key1') = 1; 
id |   json 
----+------------------------ 
    1 | {"key1":1, "key2":"a"} 
(1 row) 


-- Group by 
db=> select min(id) as min_id from json_test group by json_extract_path_text(json, 'key2') order by min_id; 
min_id 
-------- 
     1 
     2 
     4 
(3 rows) 

有关“JSON_EXTRACT_PATH_TEXT”函数的详细信息,请参见Redshift Dev Guide - JSON_EXTRACT_PATH_TEXT Function。 您还可以在Redshift Dev Guide - JSON Functions中看到其他JSON函数。

+3

该功能使用的速度有多快?与将json分成自己的列相比,它是否会带来重大的速度影响,并为新的密钥添加新列? – Solomon 2015-03-28 13:48:51

+4

由于以下原因,速度可能会有所不同:''我们建议谨慎使用JSON。JSON不适合存储较大的数据集,因为通过将不同数据存储在单个列中,JSON不会利用Amazon Redshift的列存储体系结构。“'[Redshift开发指南 - JSON函数](http://docs.aws.amazon.com/redshift/latest/dg/json-functions.html) – 2015-06-01 23:37:18