CUBE SUGAR CONTAINER

技術系のこと書きます。

MariaDB のテーブルに CSV でデータを読み込む

今回は MariaDB のテーブルに CSV ファイル経由でデータを読み込む方法について。 ちょくちょくやり方を調べている気がするのでメモしておく。

使った環境は次のとおり。

$ sw_vers
ProductName:    macOS
ProductVersion: 12.1
BuildVersion:   21C52
$ uname -rm
21.2.0 arm64
$ mysql --version      
mysql  Ver 15.1 Distrib 10.6.4-MariaDB, for osx10.17 (arm64) using readline 5.1

もくじ

下準備

あらかじめ Homebrew を使って MariaDB をインストールする。 サンプルデータをダウンロードするために wget も入れておく。

$ brew install mariadb wget

インストールできたら MariaDB のサービスを開始する。 本来は mysql_secure_installation を実行して作業した方が望ましいけど、今回は省略する。

$ brew services start mariadb
$ brew services list          
Name    Status  User    File
mariadb started amedama ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist

サンプルデータとして、Seaborn が利用している taxis データセットを使う。 これはタクシーの利用情報に関するデータセットになっている。

$ wget https://raw.githubusercontent.com/mwaskom/seaborn-data/master/taxis.csv

あらかじめ example という名前でデータベースを作っておく。

$ mysql -vvv -e "CREATE DATABASE IF NOT EXISTS example"
--------------
CREATE DATABASE IF NOT EXISTS example
--------------

Query OK, 1 row affected (0.000 sec)

Bye

そして、taxis データセットに適合する形でテーブルを用意する。

$ cat << 'EOF' | mysql -vvv -D example
CREATE TABLE IF NOT EXISTS taxis (
  pickup DATETIME,
  dropoff DATETIME,
  passengers INT,
  distance FLOAT,
  fare FLOAT,
  tip FLOAT,
  tolls FLOAT,
  total FLOAT,
  color TEXT,
  payment TEXT,
  pickup_zone TEXT,
  dropoff_zone TEXT,
  pickup_borough TEXT,
  dropoff_borough TEXT
);
EOF
--------------
CREATE TABLE IF NOT EXISTS taxis (
  pickup DATETIME,
  dropoff DATETIME,
  passengers INT,
  distance FLOAT,
  fare FLOAT,
  tip FLOAT,
  tolls FLOAT,
  total FLOAT,
  color TEXT,
  payment TEXT,
  pickup_zone TEXT,
  dropoff_zone TEXT,
  pickup_borough TEXT,
  dropoff_borough TEXT
)
--------------

Query OK, 0 rows affected (0.097 sec)

Bye

CSV ファイルからデータを読み込む

さて、ここからが今回の本題になる。 CSV ファイルからデータを読み込むときは LOAD DATA LOCAL INFILE でファイルパスを指定する。 また、フィールドの区切り文字などを同時に指定している。 そして、サンプルファイルは最初にヘッダの行が含まれるので IGNORE 1 LINES で最初の 1 行を読み飛ばしている。

$ cat << 'EOF' | mysql -vvv -D example
LOAD DATA LOCAL INFILE "taxis.csv"
INTO TABLE taxis
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
EOF
--------------
LOAD DATA LOCAL INFILE "taxis.csv"
INTO TABLE taxis
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
--------------

Query OK, 6433 rows affected (0.054 sec)
Records: 6433  Deleted: 0  Skipped: 0  Warnings: 0

Bye

確認すると、ちゃんとテーブルにデータが読み込まれていることがわかる。

$ mysql -vvv -D example -e "SELECT * FROM taxis LIMIT 5"
--------------
SELECT * FROM taxis LIMIT 5
--------------

+---------------------+---------------------+------------+----------+------+------+-------+-------+--------+-------------+-----------------------+-----------------------+----------------+-----------------+
| pickup              | dropoff             | passengers | distance | fare | tip  | tolls | total | color  | payment     | pickup_zone           | dropoff_zone          | pickup_borough | dropoff_borough |
+---------------------+---------------------+------------+----------+------+------+-------+-------+--------+-------------+-----------------------+-----------------------+----------------+-----------------+
| 2019-03-23 20:21:09 | 2019-03-23 20:27:24 |          1 |      1.6 |    7 | 2.15 |     0 | 12.95 | yellow | credit card | Lenox Hill West       | UN/Turtle Bay South   | Manhattan      | Manhattan       |
| 2019-03-04 16:11:55 | 2019-03-04 16:19:00 |          1 |     0.79 |    5 |    0 |     0 |   9.3 | yellow | cash        | Upper West Side South | Upper West Side South | Manhattan      | Manhattan       |
| 2019-03-27 17:53:01 | 2019-03-27 18:00:25 |          1 |     1.37 |  7.5 | 2.36 |     0 | 14.16 | yellow | credit card | Alphabet City         | West Village          | Manhattan      | Manhattan       |
| 2019-03-10 01:23:59 | 2019-03-10 01:49:51 |          1 |      7.7 |   27 | 6.15 |     0 | 36.95 | yellow | credit card | Hudson Sq             | Yorkville West        | Manhattan      | Manhattan       |
| 2019-03-30 13:27:42 | 2019-03-30 13:37:14 |          3 |     2.16 |    9 |  1.1 |     0 |  13.4 | yellow | credit card | Midtown East          | Yorkville West        | Manhattan      | Manhattan       |
+---------------------+---------------------+------------+----------+------+------+-------+-------+--------+-------------+-----------------------+-----------------------+----------------+-----------------+
5 rows in set (0.001 sec)

Bye

いじょう。