[Python]pandasデータフレームでRedShiftのテーブルを作成

[Python]pandasデータフレームでRedShiftのテーブルを作成
たまにPython経由でAmazon RedShift(RDS)で作業していると、pandasで作ったデータフレームをRDS上にテーブルとして作成したいときがあります。というわけで、今回はpandasで作成したデータフレームをAmazon RedShift上にテーブルとして作成する方法を記事にしてみます。

pandas-redshiftのインストール

本来、pandasのデータフレームをRDS上に再現する場合、一度テキストファイルに吐き出し、それをAmazon S3(S3)にアップロード。アップロードが完了したら、次にS3からRDSにテーブルを作成するクエリーを実行する必要があります。少し面倒なのでpandas-redshiftモジュールを使います。

先ずはpipからpandas-redshiftモジュールをインストールします。

pip install pandas-redshift

モジュールの呼び出しとダミーデータの作成

pandas-redshiftモジュールの呼び出し及びRDS上にテーブルとして作成するデータフレーム例を作成します。

In [1]:
#モジュールの読み込み
import pandas_redshift as pr
import pandas as pd

#ダミーデータを作成
df = pd.DataFrame({
    'cust_id':['A','B','C','D','E','F'],
    'sales_date':['2017-04-18','2017-04-18','2017-04-30','2017-04-30','2017-05-02','2017-05-02'], #date
    'score':[1000,2000,3000,4000,5000,6000]
},columns=['cust_id','sales_date','score'])

df
Out[1]:
cust_id sales_date score
0 A 2017-04-18 1000
1 B 2017-04-18 2000
2 C 2017-04-30 3000
3 D 2017-04-30 4000
4 E 2017-05-02 5000
5 F 2017-05-02 6000

文字列のcust_id、日付型のsales_date、整数型のsocreを例として作ってみました。

RDSとS3への接続

RDSへデータフレームをアップするにはS3を経由する必要があるので、RDSとS3への接続を行います。接続に必要な情報を以下形式に沿って入力、実行して下さい。

RDSへの接続

In [2]:
pr.connect_to_redshift(dbname = 'db', #テーブルを作成するDB
                        host = 'hogehoge.hogehoge.hogehoge.redshift.amazonaws.com', #レッドシフトのhost
                        port = '1235', #ポート番号
                        user = 'user_name', #ユーザー名
                        password = 'pass' #パスワード
                      )

S3への接続

In [3]:
pr.connect_to_s3(aws_access_key_id = 'hogehogehoge', #アクセスID
                aws_secret_access_key = 'hogehoguehogehogehohouge', #アクセスキー
                bucket = 'bucket_name', #経由するバケット
                subdirectory = 'dir_path' #経由するバケット内のディレクトリ
                )

これで準備は完了です。

RDSへデータフレームをアップロード

実際にデータフレームをRDSにアップしていきます。データフレームをアップロードするにはpandas_to_redshiftを用います。以下のように必要な情報を入力します。

In [4]:
pr.pandas_to_redshift(data_frame = df, #RDSにテーブルとして作成するデータフレーム
                        redshift_table_name = 'table_name', #作成するテーブル名
                        column_data_types=['varchar(40)','date','varchar(20)']#データ型の指定)
saved file table_name.csv in bucket to_redshift/table_name.csv
create table table_name (cust_id varchar(40), sales_date date, score varchar(20))
CREATING A TABLE IN REDSHIFT

        copy t_journal
        from 's3://hogehoge/hogehohoge/table_name.csv'
        delimiter ','
        ignoreheader 1
        csv quote as '"'
        dateformat 'auto'
        timeformat 'auto'
        access_key_id 'hogehogehougehougeghouge'
        secret_access_key 'hogehoghogehogheoghohohoge'
        ;
FILLING THE TABLE IN REDSHIFT

FILLING THE TABLE IN REDSHIFTと出力されればOKです。RDS上にredshift_table_nameで指定したテーブルができてるはずです。作成されていることを確認したら接続を閉じて終了です。

In [5]:
pr.close_up_shop()

まとめ

普通だとデータフレームから書き出して、それをS3にアップして、さらにRDSにテーブルとして読み込ませるといった3ステップが必要です。しかし、pandas_redshiftはpython上で一気に実行してくれるのでとても効率的で便利ですね。今日はこのへんで。

Pythonカテゴリの最新記事