Importing Ashley Madison CreditCardTransactions CSVs to MySQL
アシュレイ・マディソンのクレジットカード取引CSV を MySQL にインポートする
各CSVの頭にあるヘッダはこうなっている。カード番号は、下4桁のみ。
Each CSV files have the following header. It contains last 4-digits of credit card number.
ACCOUNT,ACCOUNT NAME,AMOUNT,AUTH CODE,AVS,BRAND,CARD ENDING,CVD,FIRST NAME,LAST NAME,MERCHANT TRANS. ID,OPTION CODE,DATE,TXN ID,CONF. NO.,ERROR CODE,AUTH TYPE,TYPE,TXT_CITY%2CTXT_COUNTRY%2CTXT_EMAIL%2CTXT_PHONE%2CTXT_STATE%2CTXT_ADDR1%2CTXT_ADDR2%2CZIP%2CCONSUMER_IP,
これに対応したテーブルを作る。フィールド長がわからないので、適当に varchar(255) にしておく。インデックスも、使いそうなフィールドに適当に付けておく。
I created the corresponding table below. Each field length is unknown, so use varchar(255). Additionally, I added some indexes to maybe useful fields.
drop table if exists creditcard_transactions;
create table creditcard_transactions (
account integer,
account_name varchar(255),
amount float,
auth_code varchar(255),
avs varchar(255),
brand varchar(255),
card_ending varchar(255),
cvd varchar(255),
first_name varchar(255),
last_name varchar(255),
merchant_trans_id varchar(255),
option_code varchar(255),
date datetime,
txn_id varchar(255),
conf_no varchar(255),
error_code varchar(255),
auth_type varchar(255),
type varchar(255),
txt_city varchar(255),
txt_country varchar(255),
txt_email varchar(255),
txt_phone varchar(255),
txt_state varchar(255),
txt_addr1 varchar(255),
txt_addr2 varchar(255),
zip varchar(255),
consumer_ip varchar(255),
index (account),
index (account_name),
index (brand),
index (first_name),
index (last_name),
index (date),
index (auth_type),
index (type),
index (txt_city),
index (txt_country),
index (txt_email),
index (txt_phone),
index (txt_state),
index (txt_addr1),
index (txt_addr2),
index (zip),
index (consumer_ip)
) default character set=utf8;
mysqlimport コマンドでインポートする。ただしCSVファイルの数が多いので、スクリプトにする。mysqlimport は、CSVファイル名とテーブル名が一致することを求めるから、ln でシンボリックリンクを張りながら 1つひとつインポートしていく。
You can import these CSV files by mysqlimport command. But you have a large number of CSV files. So I created a tiny shell script. mysqlimport requires that the file name of CSV file and the table name are the same. I use symbolic links to meet to this restriction.
#!/bin/sh
for f in *_downloaded.csv
do
echo $f
ln -sf $f creditcard_transactions.csv
mysqlimport \
--ignore-lines=3 \
--fields-terminated-by=, \
--fields-optionally-enclosed-by='"' \
--columns='account,account_name,amount,auth_code,avs,brand,card_ending,cvd,first_name,last_name,merchant_trans_id,option_code,date,txn_id,conf_no,error_code,auth_type,type,txt_city,txt_country,txt_email,txt_phone,txt_state,txt_addr1,txt_addr2,zip,consumer_ip' \
--local \
-uroot \
creditcard \
/home/horiuchi/data/dmps/CreditCardTransactions/creditcard_transactions.csv
done
AWS の m4.large に MySQL をインストールしてデフォルトの設定のままで上記を実行したときに、確か5-6時間かかっている。なお、分析に使わないフィールドは update をかけて消しておきましょう。。。
If I remember correctly, it took 5-6 hours on AWS m4.large instance on which I installed MySQL using default configuration. I recommend you to run UPDATE SQL and remove unnecessary fields.