2014-10-28 21 views
8

Chúng tôi dự định bắt đầu sử dụng Redshift sớm và một trong các trường (cột) của chúng tôi là một giá trị JSON. Đó là một JSON phẳng (nghĩa là theo định nghĩa không có mức lồng nhau) và lý do chúng ta phải sử dụng JSON là mỗi bản ghi có số lượng khác nhau của các phần tử khóa-giá trị khác nhau, có thể rất từ ​​0 đến 10 hoặc nhiều hơn (vì vậy tôi không thể sử dụng lĩnh vực cho mỗi cặp hoặc như vậy).Truy vấn các trường JSON trong Redshift

Ví dụ, lĩnh vực này có thể bị { "key1": "value1", "khóa2": "value2", ..., "key5": "value5"}

Tôi muốn truy vấn và đếm tất cả các bản ghi có một số khóa cụ thể và có thể nhóm chúng theo giá trị. Trong ví dụ trên, tôi muốn một cái gì đó như "select count (*), trong đó field có key 'key1' group theo giá trị của nó".

Hỗ trợ Redshift có truy vấn bởi các giá trị trong JSON không? Làm thế nào có thể đạt được?

Trả lời

7

Bạn đã thử sử dụng chức năng JSON_EXTRACT_PATH_TEXT của Redshift?

+0

Thấy rằng, không chắc chắn nếu nó có thể trả lời các yêu cầu của tôi và liệu tôi có thể sử dụng nó trong một mệnh đề where (vì lý do kỹ thuật tôi chưa có thực hành RS DB). – user2339344

14

Có, Amazon Redshift hỗ trợ phân tích chuỗi JSON trong một cột có hàm "JSON_EXTRACT_PATH_TEXT" và bạn có thể gọi hàm này ngay cả trong mệnh đề where hoặc nhóm theo mệnh đề. Tốt hơn là nên xem ví dụ sau để hiểu cách hoạt động của nó.

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) 

Xem chi tiết về hàm "JSON_EXTRACT_PATH_TEXT". Ngoài ra, bạn có thể thấy các hàm JSON khác trong Redshift Dev Guide - JSON Functions.

+3

Chức năng đó sử dụng nhanh đến mức nào? Liệu nó có tác động tốc độ lớn so với việc tách các json thành các cột riêng của nó, và chỉ thêm các cột mới cho các khóa mới? – Solomon

+4

Có thể có các tác động tốc độ do những điều sau ... '" Chúng tôi khuyên bạn nên sử dụng JSON một cách tiết kiệm. JSON không phải là một lựa chọn tốt để lưu trữ các tập dữ liệu lớn hơn, bằng cách lưu trữ dữ liệu khác nhau trong một cột, JSON không tận dụng kiến ​​trúc kho lưu trữ cột của Amazon Redshift . "' [Hướng dẫn tìm kiếm Redshift - Các hàm JSON] (http://docs.aws.amazon.com/redshift/latest/dg/json-functions.html) –

Các vấn đề liên quan