遅ればせながら、AWSのRedshiftというサービスについてです。
Redshiftはデータウェアハウス(DWH)をサービスにしたものです。
DWHというのは簡単に言うと、専用ツールなどを使って様々な角度で分析するためのあらゆるデータの集まりです。
各所に分散している様々なデータを統合して関連付け、見えない傾向や状況などを知ることでビジネスの意思決定
(ビジネスインテリジェンス:BIというそうです)をしやすくするために用いられるようです。
直接関わり合いのない業務同士のデータも関連付けに利用されたり、過去との比較も重要な分析になるため、
通常のデータベースよりも巨大になります。
従来のDWHでは、専用のハードウェアとソフトウェアを利用するため高価でしたが、Redshiftが出たことにより
はるかに安価で気軽に利用することができるようになりました。

では、具体的どのようなものか、少しずつ触ってみて勉強していきたいと思います。

Redshiftは、言ってみればAWSが提供している巨大なPostgreSQLベースのクラスタです。
まずは、たくさんのデータを集計しやすいDBだと思って触ってみます。

AWSコンソールでRedshiftの画面を開いてみます。

「Launch Cluster」をクリックします。
Cluster名やデータベース名などを適宜入力します。

ノードの設定です。
クラスタの各ノードのインスタンスタイプとノード数を設定します。
最低2ノードからになります。
今回は2ノードにします。

追加設定です。
パラメータグループやセキュリティグループ、VPCに入れるかなどを設定します。
今回は全てデフォルトにします。

設定内容を確認して、「Launch Cluster」をクリックします。

クラスタ一覧に今作成したクラスタが表示されました。
ステータスを見るとcreatingとなっているので、準備中なのだと思います。。

しばらくすると、availableに変わり、これで使えるようです。
クラスタ名のリンクをクリックしてみます。

そうすると、詳細情報が開きます。
接続エンドポイントやJDBC、ODBCの接続子などが表示されています。

また、Security Groupsで、defaultグループにアクセス可能なIPを設定しておきます。

今回は、専用ツールなどは利用せず、psqlでこのエンドポイントに直接接続してみます。

$ psql -h myfirstdwh.cr0bw6iq1m5m.us-east-1.redshift.amazonaws.com -p 5439 -U memorycraft -W myfirstdwh
Password for user memorycraft: XXXXXXXXXX

psql (9.1.5, server 8.0.2)
WARNING: psql version 9.1, server version 8.0.
Some psql features might not work.
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

myfirstdwh=#

接続できました。
通常のpostgreSQLとRedshiftのpostgreSQLインターフェースの違いは以下のようになっているそうです。

○CREATE TABLE

Amazon Redshiftはテーブルスペース,パーティショニング,継承,制約をサポートしません。
Redshift では並列処理を最適化するために、CREATE TABLEにおいてsortとdistributionアルゴリズムを
定義することができます。

○ALTER TABLE
ALTER COLUMNはサポートされません。 ADD COLUMNは1つのALTER TABLEステートメントにつき1カラムだけ指定できます。

○COPY
RedshiftではS3バケットとDynamoDBから自動圧縮してデータをロードするために特別にカスタマイズされています。

○SELECT
ORDER BY … NULLS FIRST/LAST は未サポートです

○INSERT, UPDATE, and DELETE
WITHは未サポートです

○VACUUM
VACUUMのパラメータはpostgreSQLとRedshiftではまったく異なります。

今回は試しに、日本の郵便番号データを投入してみます。
以下のサイトからダウンロードした全国一括の郵便番号CSVファイルをS3にアップします。
現段階で、Redshiftは同一リージョンのS3でないとロードできないため、USリージョンのバケットに配置します。

次に、このCSVのフォーマットに合わせてテーブルを作成します。

create table zipcode(
official_area_code integer,
old_zipcode varchar(10),
zipcode varchar(10) distkey sortkey,
prefecture_name_kana varchar(500),
city_name_kana varchar(500),
town_name_kana varchar(500),
prefecture_name varchar(500),
city_name varchar(500),
town_name varchar(500),
flag_a smallint,
flag_b smallint,
flag_c smallint,
flag_d smallint,
flag_e smallint,
flag_f smallint
);

そしてデータをロードします。
ロードにはCOPYコマンドを利用します。
CSVはカンマ区切りなので、DELIMITER句で “,”を指定します。
また、文字列はダブルクォーテーションで囲われているので、REMOVEQUOTES句を利用します。
また、S3バケットへのアクセスにはCREDENTIALS句を利用して、AWSアクセスキーとシークレットキーを
指定します。

COPY zipcode FROM 's3://redshift-us-region/KEN_ALL.CSV' CREDENTIALS 'aws_access_key_id=;aws_secret_access_key=' DELIMITER ',' REMOVEQUOTES;

COPY

ロードに成功した場合はCOPYと表示されます。
ロードに失敗した場合は詳細ログがstl_load_errorsテーブルに出力されるので、SELECTなどして確認します。

select * from stl_load_errors where filename = 'KEN_ALL.CSV';

データの投入が完了したので、集計などしてみます。

select count(distinct zipcode) from zipcode where prefecture_name = '北海道';
count
-------
8006
(1 row)

このように集計できました。

今回は手元のマシンからのアクセスで、データ数も少ないため、パフォーマンス面での性能はまだわかりませんが、
psqlで接続できるのはとても手軽です。
今後もいろいろ触って試してみたくなりました。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら