środa, 21 stycznia 2015

Import danych do MySQL lub PostgreSQL

Zacznijmy od MySQLa

Kiedyś napisałam dwa krótkie posty na temat exportu danych z MySQLa (znajdziecie go tutaj) i z PostgreSQLa (przeczytacie go tutaj) ale nie napisałam jak wykonać ich import. Czas uzupełnić tą lukę.

Zaimportujmy dane do tabeli test1.

mysql> show create table test1 \G
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `c` int(11) DEFAULT NULL,
  `t` int(11) DEFAULT NULL,
  `cn` varchar(2) DEFAULT NULL,
  `d` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)



ela@skyler:~/Downloads$ mysqlimport -uroot -proot --lines-terminated-by='\n' --fields-terminated-by='\t' --local test test1.csv
test.test1: Records: 9765275  Deleted: 0  Skipped: 0  Warnings: 29193
ela@skyler:~/Downloads$ ll
total 212080
drwxr-xr-x  2 ela ela      4096 sty  5 13:15 ./
drwxr-xr-x 19 ela ela      4096 sty  5 13:15 ../
-rw-rw-r--  1 ela ela   1914553 sty  5 12:40 arch_geoip_201411.csv.tar.gz
-rw-rw-r--  1 ela ela   1299844 sty  5 12:39 PerconaToolkit-2.2.12.pdf
-r-xr-xr-x  1 ela ela 213941449 gru 30 16:47 test1.csv*
ela@skyler:~/Downloads$ wc -l test1.csv 
9765275 test1.csv

Do importu danych najlepiej użyć dedykowanej do tego binarki: mysqlimport, której dokumentację znajdziecie tutaj, a i wspominałam o tej binarce w innym poście, na temat dostępnych programów w instalacji serwera MySQL (Binarki MySQLa).

W trakcie importu danych mamy jednak dane, które musimy odpowiednio najpierw zapisać. Przykładowo znak NULL, który jak wcześniej zauważyliście spowodował wystąpienie Warningów przy imporcie, nie możemy zapisać jako string NULL tylko jako odpowiedni znak \N (link do dokumentacji). Dopiero wtedy zostanie poprawnie zaimportowany do MySQLa. Oto przykładowa zawartość pliku CSV:

ela@skyler:~/Downloads$ head test1.csv 
45 42 NULL 2014-11-01
45 42 NULL 2014-11-02
45 42 NULL 2014-11-06
45 42 NULL 2014-11-07
45 42 NULL 2014-11-08
45 42 NULL 2014-11-09
45 42 NULL 2014-11-09
45 42 NULL 2014-11-10
45 42 NULL 2014-11-10
45 42 NULL 2014-11-11

Importując je do naszej tabeli test1, dane z kolumny cn zostaną obcięte do dwóch znaków. W dodatku te dane zostały potraktowane jako stringi, a nie jak powinny jako znak NULL. Dlatego musimy poprawić nasz plik zanim zaczniemy proces importu:

ela@skyler:~/Downloads$ cat test1.csv | replace NULL '\N' > test2.csv
ela@skyler:~/Downloads$ head test2.csv 
45 42 N 2014-11-01
45 42 N 2014-11-02
45 42 N 2014-11-06
45 42 N 2014-11-07
45 42 N 2014-11-08
45 42 N 2014-11-09
45 42 N 2014-11-09
45 42 N 2014-11-10
45 42 N 2014-11-10
45 42 N 2014-11-11
ela@skyler:~/Downloads$ time mysqlimport -uroot -proot --lines-terminated-by='\n' --fields-terminated-by='\t' --local --columns=c,t,cn,d test test2.csv
test.test2: Records: 9765275  Deleted: 0  Skipped: 0  Warnings: 0

real 2m18.113s
user 0m0.059s
sys 0m0.188s

Dane został tym razem zapisane i zaimportowane do tabeli test2. Jeśli dobrze zauważyliście to tym razem wskazałam do jakich kolumn mają zostać zaimportowane dane przy pomocy opcji --column (-C).

Teraz czas przyszedł na PostgreSQL

No cóż. Nie ma sensu aby wspominać o tym ponownie. Ciąg dalszy tego posta był by tylko kopią innego napisanego przeze mnie jakiś czas temu o PGLoaderze (PGloader - narzędzie do importu danych). Mając prawa administracyjne do serwera, na którym stoi ten serwer, możecie bezpośrednio użyć polecenia COPY, a wcześniej przekopiować ten plik na ten serwer.

Miłej zabawy :-)

Brak komentarzy:

Prześlij komentarz