data-science Kaggle

Kaggleで容量の大きいcsvファイルを取り扱うには?(Postgresql編)

Kaggleをやってると大きめのCSVファイルデータが用意されていて処理に困ったので、今回はそれを Postgresql で処理して容量を減らして再びCSVにしていきます。

想定ファイル

今回は次のようなcsvを扱います。

sample.csv

uuid,name,price,date
xxxxxxxxxxxx,tomato,10,2017-10-19
yyyyyyyyyyyy,banana,8,2017-10-19

Postgres に DB を作ってアクセスする

  • 入力ファイルがあるディレクトリで作業を行う
  • sampleという名前のDBを作成する
  • 登録されているユーザー名(username)でsample DBにアクセスする
$ ls # 入力ファイルがあるディレクトリで作業を行う
sample.csv

$ createdb sample

$ psql -d sample -U (username)

Table を作る

  • samplesという Table を作成する。csvと同じ構成になるようにカラムを設定する
  • \dで作ったTableが存在するかを確認
sample=# CREATE TABLE samples (
    uuid            varchar(80),
    name            varchar(80),
    price           int,
    date            date
);
sample=# \d
         List of relations
 Schema |  Name   | Type  | Owner
--------+---------+-------+--------
 public | samples | table | username

ローカルのcsvをインポートする

  • 今回は \copy でメタコマンドを使っているが、COPYコマンドを使う場合は絶対パスを指定してあげる
  • header を追加することでcsvの最初の行を無視してくれる
sample=# \copy samples from 'sample.csv' with csv header;
COPY 2
sample=# select * from samples;
     uuid     |  name  | price |    date
--------------+--------+-------+------------
 xxxxxxxxxxxx | tomato |    10 | 2017-10-19
 yyyyyyyyyyyy | banana |     8 | 2017-10-19
(2 rows)

SQLの実行結果をcsvで出力する

  • ローカルに output.csv が出力される
sample=# \copy (SELECT uuid, name, price, date FROM samples WHERE price > 9) to 'output.csv' with csv delimiter ',' header;

output.csv

uuid,name,price,date
xxxxxxxxxxxx,tomato,10,2017-10-19

これで、sqlで処理して容量を減らしたcsvができるようになった。