web-dev-qa-db-ja.com

RedshiftでのJSONフィールドのクエリ

間もなくRedshiftの使用を開始する予定であり、フィールド(列)の1つはJSON値です。これはフラットなJSONであり(つまり、定義上、ネストされたレベルはありません)、JSONを使用する必要がある理由は、各レコードに異なる数の異なるKey-Value要素があり、0から10以上になる可能性があるためです(したがって、ペアごとのフィールドなど)。

たとえば、このようなフィールドは{"key1": "value1"、 "key2": "value2"、...、 "key5": "value5"}のようになります。

特定のキーを持つすべてのレコードをクエリしてカウントし、場合によっては値でグループ化したいと思います。上記の例では、「select count(*)where field has key 'key1' group by its value」のようなものを望んでいます。

RedshiftはJSON内の値によるクエリをサポートしていますか?どうすればそのようなことが達成できますか?

11
user2339344

Redshiftの JSON_EXTRACT_PATH_TEXT 関数を使用してみましたか?

12
Pop

はい、Amazon Redshiftは「JSON_EXTRACT_PATH_TEXT」関数を使用して列内のJSON文字列の解析をサポートしており、where句またはgroupby句でもこの関数を呼び出すことができます。次の例を見て、それがどのように機能するかを理解することをお勧めします。

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開発ガイド-JSON_EXTRACT_PATH_TEXT関数 を参照してください。また、他のJSON関数も Redshift開発ガイド-JSON関数 で確認できます。

17

他の回答に記載されているように、JSON_EXTRACT_PATH_TEXTはjsonを解析する方法であるため、jsonプロパティをクエリできます。ただし、速度には大きな影響があります。 json blobの何かでフィルタリングする必要がある場合は、それを抽出して、レコードの通常のフィールドとして保存する必要があります。

0
Denis Roarty