データ投入環境の作成
投入するデータが大方整いました。次は投入に際して必要となる環境を作っていきます。
S3バケットの準備
まず始めにCSVをアップロードすることになるバケットを用意します。前回連載では東京リージョンにAmazon Redshiftクラスタを作成していますので、バケットも同じリージョンとなるTokyoに作成します。
スキーマの作成
今回データを投入するテーブルが属するスキーマを別途新規作成します。名前は『codezine』としたいと思います。クラスタ作成時のスーパーユーザーでDBにログインし、以下CREATE SCHEMAコマンドでスキーマを作成してください。
$ psql -h (エンドポイント名) -U (ユーザー名) -d (データベース名) -p (ポート番号) Password for user xxxx: (パスワード入力) # CREATE SCHEMA codezine; CREATE SCHEMA
Amazon Redshiftクラスタ環境作成については前回の記事『Amazon Redshiftによるビッグデータ分析環境の構築手順』をご参照ください。
psqlを用いてのAmazon Redshiftクラスタ環境へのログイン詳細については、前回の記事の5ページ目を参照してください。
個別にスキーマを作成した場合、システム系のテーブルやビューからアクセス可能な状態にするために、システムにスキーマ情報を登録しておく必要があります。何かと利用する機会は多いと思いますので、ぜひ登録しておいてください。
クラスタが利用しているパラメータグループを編集し、『search_path』というパラメータにカンマ区切りで対応するスキーマ名を追加してください。操作完了後Amazon Redshiftクラスタの再起動を促されるので再起動実施を行うと以降は該当スキーマ内の情報も利用できるようになります。
テーブルの作成
Excelの各種シート(テーブルに対応)の内容と照らし合わせながら、データを格納するためのテーブル定義を作成します。テーブルの項目ごとのデータ型や列圧縮タイプについては、データが収まるべき型と内容などを吟味した上で下記ドキュメントを参考に定義しています。
投入するデータが一定件数(デフォルトでは10万件以上)ある場合は、以下の機能を参考にテーブルの項目型や列圧縮タイプを定めてみても良いでしょう。
以下が全5テーブルのテーブル定義情報(CREATE TABLE文)です。psqlでログインした状態で以下CREATE TABLE文を実行してください。『CREATE』というメッセージが出ていれば作成できています。
CREATE TABLE codezine.orders ( order_id INT encode lzo NOT NULL, /** オーダー ID */ order_date DATE encode delta NOT NULL, /** 受注日 */ priority VARCHAR(15) encode bytedict NOT NULL, /** 優先度 */ quantity SMALLINT encode mostly8 NOT NULL, /** 数量 */ sales BIGINT encode lzo NOT NULL, /** 売り上げ */ discount_rate DOUBLE PRECISION, /** 割引率 */ shipping_mode VARCHAR(20) encode bytedict NOT NULL, /** 出荷モード */ profit INT encode lzo NOT NULL, /** 利益 */ unit_price INT encode lzo NOT NULL, /** 単価 */ ad_expences INT encode lzo NOT NULL, /** 宣伝費 */ shipping_cost INT encode mostly16 NOT NULL, /** 発送費用 */ customer_name VARCHAR(50) encode lzo NOT NULL, /** 顧客名 */ prefecture VARCHAR(20) encode bytedict NOT NULL, /** 都道府県 */ city VARCHAR(30) encode bytedict NOT NULL, /** 市町村 */ area VARCHAR(15) encode bytedict NOT NULL, /** 地域 */ shop_name VARCHAR(50) encode lzo NOT NULL, /** 店名 */ customer_segment VARCHAR(50) encode bytedict NOT NULL, /** 顧客区分 */ product_category VARCHAR(50) encode bytedict NOT NULL, /** 製品カテゴリー */ product_sub_category VARCHAR(100) encode bytedict NOT NULL, /** 製品サブカテゴリー */ product_id CHAR(15) encode lzo NOT NULL, /** プロダクト ID */ product_name VARCHAR(300) encode lzo NOT NULL, /** 製品名 */ product_description VARCHAR(500) encode lzo NOT NULL, /** 製品説明 */ product_container VARCHAR(50) encode bytedict NOT NULL, /** 製品コンテナー */ product_base_margin DOUBLE PRECISION, /** 製品ベースマージン */ supplier VARCHAR(50) encode bytedict NOT NULL, /** サプライヤー */ delivery_date DATE encode delta NOT NULL, /** 配達予定日 */ shipment_date DATE encode delta NOT NULL, /** 発送日 */ PRIMARY KEY(order_id) ) distkey(order_id) sortkey(order_date); ---------- CREATE TABLE codezine.inventory ( store_name VARCHAR(20) encode bytedict NOT NULL, /** 店名 */ product_id CHAR(15) encode lzo NOT NULL, /** プロダクト ID */ product_name VARCHAR(300) encode lzo NOT NULL, /** 製品名 */ inventory DOUBLE PRECISION, /** インベントリ */ PRIMARY KEY(product_id) ) distkey(product_id) sortkey(product_id); ---------- CREATE TABLE codezine.customer ( customer_name VARCHAR(50) encode lzo NOT NULL, /** 顧客名 */ life_time_revenue DOUBLE PRECISION, /** 生涯収入 */ age_group CHAR(10) encode bytedict NOT NULL, /** 年代グループ */ tenure CHAR(20) encode bytedict NOT NULL, /** 在職期間 */ PRIMARY KEY(customer_name) ) distkey(customer_name) sortkey(customer_name); ---------- CREATE TABLE codezine.prefecture ( prefecture VARCHAR(20) encode bytedict NOT NULL, /** 都道府県 */ capital VARCHAR(20) encode bytedict NOT NULL, /** 県庁所在地 */ region VARCHAR(10) encode bytedict NOT NULL, /** 地域 */ major_island VARCHAR(20) encode bytedict NOT NULL, /** 所属本土 */ population INT encode lzo NOT NULL, /** 人口 */ area DOUBLE PRECISION, /** 面積 */ destiny INT encode lzo NOT NULL, /** destiny */ distr SMALLINT NOT NULL, /** distr */ municop SMALLINT NOT NULL, /** municop */ prefecture_code CHAR(2) encode bytedict NOT NULL, /** 都道府県コード */ PRIMARY KEY(prefecture_code) ) diststyle ALL sortkey(prefecture_code); ---------- CREATE TABLE codezine.targets ( product_category VARCHAR(25) encode bytedict NOT NULL, /** 製品カテゴリ */ product_sub_category VARCHAR(70) encode lzo NOT NULL, /** 製品サブカテゴリ */ sales_target DOUBLE PRECISION NOT NULL, /** 売上目標額 */ PRIMARY KEY(product_category, product_sub_category) ) diststyle ALL sortkey(product_category, product_sub_category);