はじめに
Amazon Redshiftは、Amazon Web Services(AWS)が提供するデータウェアハウス(DWH)サービスで、2013年2月に正式リリースされ、同6月4日には東京リージョンでも利用可能になりました。既存のDWHと比較しても安価で、PostgreSQLベースで容易に高速なデータ分析が可能であることなどが知られており、注目も高まっています。
ところが、日本国内では「使ってみた」という情報は非常に少ないです。幸運にも筆者は、限定プレビューの段階からRedshiftに触れる機会に恵まれました。そこで、今回は「こんな使い方をしてみました」「こんなところでつまずいた」といったことを中心に紹介したいと思います。
なお、本記事は限定プレビュー~サービス開始当初の米国東部リージョンでの使用結果を元に執筆しており、当時のAPIバージョンは2012-12-01です。東京リージョンでの動作を保証するものではありませんので、あらかじめご了承ください。
対象読者
- Amazon EC2およびS3を使ったことのある方
- PostgreSQLを使ってSQLを書ける方
- AWSが提供する英語マニュアルを読める方
必要な環境
- AWSアカウント
準備
ではさっそくインスタンスを起動して始めましょう! ……と言いたいところではありますが、分析対象データは準備していますか? 分析によって得たい結果は明確になっていますか? インスタンスを起動する前に、きちんと準備をしておきましょう。
テーブル設計は大切
まず、分析対象データがCOPYコマンドでロードできる形式(CSV、タブ区切りなど)になっているか確認しましょう。発行するCOPYコマンドも事前に作っておくと、作業がスムーズに進められます。
データレイアウトが分かったら、ロードするテーブルのCREATE TABLE文を作っておきます。効率よく分析を行うためには、テーブル設計が非常に重要になってきます。クラスタ内のデータ配置が処理速度に影響しますので、データ型やdistkey, sortkeyなどは適切に選択しましょう。詳細は、AWSが提供する「Amazon Redshift Developer Guide」を参照してください。
CREATE TABLE文において、列にtext型を指定すると、その列はVARCHAR(256)に変換されます。長い文字列を扱う場合は、最大文字列長に注意しましょう。
クエリの作成
分析用のクエリも事前に作っておきましょう。Redshift SQLでは、PostgreSQLの中でもサポートされている関数が限定されています。
特に筆者を悩ませたのは正規表現、シーケンス、row_number()がサポートされていない点です。正規表現はlength()、substring()、strpos()などの文字列関数を駆使するなど、記述に工夫が必要です。row_number()は、次のようにsum()を代用してrownum列を作成します。
select sum(1) over (order by colname rows unbounded preceding) as rownum, colname from tablename order by 1,2;
ただし、数百億レコードのデータに対してrownumを付与すると、非常に時間がかかってしまいます。可能であれば、あらかじめロードするデータに付与しておくとよいでしょう。
緯度経度情報を使った解析も、SQLを作って計算するのは手間がかかります。こちらも事前に計算しておくと、効率が良くなると思います。
また、Redshiftは列指向型データベースなので、読み出す必要のない列はSQLに記述しないなどの工夫も必要です。
AWS環境の準備
ここまで準備したら、ようやくAWSの出番です。筆者はRedshiftの他に、EC2とS3を利用しました。
Redshift
データを分析するクラスタです。データ量に見合ったインスタンス、ノード数を選びます。セキュリティグループ設定で、クライアントとなるEC2インスタンスからのデータベースポート接続を許可します。
EC2
ODBC経由でRedshiftにアクセスするクライアントです。PostgreSQLをインストールし、ここからRedshiftに対してpsqlコマンドを発行します。
コマンドを発行して結果を受け取るだけなので、それほど高性能なインスタンスでなくても大丈夫です。また、ローカルPCからログインする場合は、セキュリティグループでSSHポートの接続許可が必要です。
S3
Redshiftにロードするデータを置く場所です。分析対象データをS3のバケットにアップロードしておき、EC2からCOPYコマンドを実行してRedshiftにデータを投入します。