kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

Redshiftへのデータの流し込みについて

環境の違いでスクリプトを変えたので、そちらを載せます kikeda1104.hatenablog.com

kikeda1104.hatenablog.com

SQLファイル -> sh

# tab区切りでファイル出力: dump.shとする
PASSWORD=password
mysql -u username -p"$PASSWORD" -h hostname db -e "select * from table_name" > /tmp/table_name.txt

コマンド実行

bash dump.sh

s3へのアップロード

s3へのアップロード aws認証情報を登録 awsのIAMからaccess_key, secret_access_keyを取得、なければ作成する。defaultは登録されているので、プロファイル名は別で定義する。 $ aws configure --profile profile_name AWS Access Key ID [None]: access_key AWS Secret Access Key [None]: secret_access_key Default region name [None]: ap-northeast-1 Default output format [None]: json shファイルを作る syncコマンドを利用してアップロードします。shファイルを作ります。 # upload_to_s3.sh aws s3 sync /tmp/txts s3://bucket_name/txts --profile profile_name --exclude '*' --include '*.txt' .... shファイルを実行 bash upload_to_s3.sh # 結果 move: /tmp/table_name.txt to s3://bucket_name/txts/table_name.txt # 成功 move failed: /tmp/table_name.txt to s3://bucket_name/txts/table_name.txt Could not connect to the endpoint URL: "endpoing" #失敗

tsvファイル出力(MySQL)とaws s3アップロード - kikeda1104's blog

テーブル定義

redshiftにテーブルを作る。 # tables.sql create table tables ( id BIGINT NOT NULL PRIMARY KEY, name VARCHAR(255), created_at TIMESTAMP, updated_at TIMESTAMP ); ソートキーは無視します。 mysql側に定義したテーブルのカラム順番とredshiftのカラムの順番を一致させている。 値を流し込む場合にredshiftの仕様により流し込みが失敗・エラーになるケースがあります。 String length exceeds DDL length Mysqlで扱うVARCHARの仕様のズレによりRedshiftではsizeを変更。 渡された数値を文字数として扱うかバイト数で扱うかの違い postgresql clientからredshiftに接続して、テーブルを作ります。 コマンドを簡易化するためにshファイルを作っておく。 # redshift.sh psql -Uusername poscalc --host=endpoint -p port # redshiftのusernameに対応したpasswordを入力する bash redshift.sh < tables.sql

テーブル定義/データインポート(Amazon Redshift) - kikeda1104's blog

s3からRedShift

#copy_to_redshift.sh

\timing

copy table_name
from 's3://bucket_name/txts/table_name.txt'
iam_role 'arn:aws:iam::664020506447:role/RedshiftRoleForClient'
region 'ap-northeast-1'
blanksasnull
emptyasnull
delimiter '\t'
NULL AS 'NULL'
;

...

参考

COPY - Amazon Redshift