RedshiftでJSONファイル形式のUNLOADを試してみた

2022.02.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

先日、RedshiftのUNLOADがJSONファイルフォーマットに対応した旨のアナウンスがありました。

今回、この機能を実際に触りながら試してみたいと思います。

前提条件

今回試してみるRedshiftは、以下になります。

  • リージョン
    • ap-northeast-1
  • クラスターバージョン
    • 1.0.35649

なおアナウンスでは、「すべての商用リージョン」で利用可能との記載がされています。

Support for exporting JSON data using UNLOAD is available in all AWS commercial Regions.

このクラスタにはIAM Roleの設定を行い、S3のバケットへファイルを出力(UNLOAD)できるように設定した状態となっています。

テーブルとデータの準備

今回は2パターン用意してみます。1つは通常のテーブル、もう1つはSUPER型のカラムを含むテーブルとします。

CREATE TABLE prefecture (
  code INTEGER,
  name VARCHAR
);
INSERT INTO prefecture (code, name) VALUES (1, '北海道');
INSERT INTO prefecture (code, name) VALUES (13, '東京都');
INSERT INTO prefecture (code, name) VALUES (47, '沖縄県');

CREATE TABLE city (
  pref_code INTEGER,
  detail SUPER
);
INSERT INTO city (pref_code, detail)
VALUES (13, JSON_PARSE('{"code": 13101, "name": "千代田区"}'));

通常のテーブルとしてprefectureを、SUPER型を含むテーブルとしてcityを用意してみました。

JSON形式でUNLOADしてみる

では、早速UNLOADをしてみます。他のファイル形式と同様にFORMATオプションにJSONをつければ良さそうですね。

まずは、通常のテーブルprefectureからやってみます。

UNLOAD ('
  SELECT
    code,
    name
  FROM
    prefecture
')
TO
  's3://foo-bar/redshift/unload/prefecture/'
FORMAT JSON
IAM_ROLE 'arn:aws:iam::123456789012:role/cm-ootaka-daisuke-redshift-role'
;

実行すると0000_part_00.jsonというファイルが指定したパスにUNLOADされていました。中身は以下の通りです。

0000_part_00.json

{"code":1,"name":"北海道"}
{"code":13,"name":"東京都"}
{"code":47,"name":"沖縄県"}

いわゆるJSONL(JSON Lines)の形式で出力されるようですね。

次に、SUPER型を含むテーブルcityでも試してみます。

UNLOAD ('
  SELECT
    pref_code,
    detail
  FROM
    city
')
TO
  's3://foo-bar/redshift/unload/city/'
FORMAT JSON
IAM_ROLE 'arn:aws:iam::123456789012:role/cm-ootaka-daisuke-redshift-role'
;

こちらも実行すると0000_part_00.jsonというファイルが指定したパスにUNLOADされていました。中身は以下の通りです。

0000_part_00.json

{"pref_code":13,"detail":{"code":13101,"name":"千代田区"}}

SUPER型の場合には、Nested-JSONの形で出力されていますね。

まとめ

以上、RedshiftでJSONファイル形式のUNLOADを試してみました。

JSONファイル形式でUNLOADできるようになったことで、他システム・サービスからのデータ利用がしやすくなったかなと思います。また、UNLOADしたものをSUPER型としても取り込めると思うので活用の幅が広がりそうですね。

どなたかのお役に立てば幸いです。それでは!