在Redshift中查询JSON字段

时间:2014-10-28 15:59:57

标签: amazon-redshift

我们计划很快开始使用Redshift,其中一个字段(列)是一个JSON值。它是一个扁平的JSON(即根据定义没有嵌套级别),我们必须使用JSON的原因是每个记录具有不同数量的不同键值元素,可能从0到10或更多(所以我不能使用每对或其他领域。)

例如,此类字段可能是{“key1”:“value1”,“key2”:“value2”,...,“key5”:“value5”}

我想查询并计算具有某些特定键的所有记录,并可能按值对它们进行分组。在上面的示例中,我想要“select count(*)where where field has key'key1'group by value”。

Redshift是否支持通过JSON中的值进行查询?如何实现这一目标?

4 个答案:

答案 0 :(得分:16)

是的,Amazon Redshift支持使用" JSON_EXTRACT_PATH_TEXT"解析列中的JSON字符串。函数,即使在where子句或group 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函数。

答案 1 :(得分:10)

您是否尝试过使用Redshift的JSON_EXTRACT_PATH_TEXT功能?

答案 2 :(得分:0)

如其他答案中所述,JSON_EXTRACT_PATH_TEXT是解析json的方式,因此您可以查询json属性。但是,它对速度有重大影响。如果您需要过滤json blob中的内容,则应提取该内容并将其作为常规字段存储在记录中。

答案 3 :(得分:0)

到目前为止尚未提及的另一个选择是使用Redshift Spectrum or other third party tools。与Redshift核心引擎相比,Spectrum具有更丰富的解析JSON的功能集。

相关问题