2013-07-15 17 views
5

jest pakiet: RMySQLR dane do przesyłania zbiorczego do bazy danych MySQL

Jak mogę przesłać zbiorczo wiele danych do mysql z R? Mam plik CSV zawierający około 1 miliona wierszy i 80 kolumn.

Czy coś takiego działa?

dbWriteTable(con, "test2", "~/data/test2.csv") ## table from a file 

boję to wstawia wiersz po wierszu ...

+0

Chciałbym również rozważyć narzędzia wiersza polecenia dla MySQL jako alternatywa. –

+1

Istnieją również interfejsy MySQL, takie jak Sequel Pro (dla komputerów Mac) i Heidi SQL (dla systemu Windows), które powinny mieć opcję importu CSV ... – Carson

+1

Jeśli dane znajdują się poza R, a wysyłasz je do miejsca docelowego, które jest również poza R, nie powinieneś angażować R. To tylko spowolni działania i wprowadzi wiele pośrednich kroków, które mogą pójść nie tak. Jedną rzeczą, którą możesz zrobić w R, jest załadowanie tylko pierwszych kilku linii w celu sprawdzenia nagłówków i typów kolumn. Może to być pomocne w zapewnieniu prawidłowej struktury tabeli. –

Odpowiedz

3

Jeśli wstawiasz wiele wierszy z tego samego klienta w tym samym czasie, można użyć INSERT z wielu wartości

INSERT INTO test2(col1, col2, col3, col4) 
VALUES 
('val1', 'val2', val3, val4), 
('val1', 'val2', val3, val4), 
('val1', 'val2', val3, val4) 

Oto przykład, jak utworzyć zapytanie. Używam data.table tutaj:

dat <- matrix(seq(4*3), 3, 4) 
library(data.table) 
DT <- data.table(t(dat)) 
query <- paste('INSERT INTO test2(col1, col2, col3, col4)\nVALUES\n', 
       gsub('c','',(DT[,paste(.SD,collapse='\n')]))) 

    cat(query) 
INSERT INTO test2(col1, col2, col3, col4) 
VALUES 
(1, 4, 7, 10) 
(2, 5, 8, 11) 
(3, 6, 9, 12) 

następnie można wykonać go za pomocą dbGetQuery:

dbGetQuery(con, query) 
+0

To także ciekawe podejście! Spróbuję i porównuję prędkości – user670186

+1

to jest świetne! dokładnie to, czego potrzebowałem! – marbel

+1

Ta odpowiedź nie działa, jeśli dane znajdują się w data.frame b/c 't (myData)' nie ma sensu dla danych.frames w ogóle. – Jthorpe

5

Skoro masz dużo danych rozważyć użycie LOAD DATA. Jest to najszybsza metoda importowania danych z pliku zgodnie z dokumentami mysql.

LOAD DATA INFILE
LOAD DATA oświadczenie INFILE czyta wiersze z pliku tekstowego do tabeli na bardzo dużą prędkością.

Speed of INSERT Statements Podczas ładowania tabeli z pliku tekstowego użyj LOAD DATA INFILE. To jest zwykle 20 razy szybsze niż niż przy użyciu instrukcji INSERT. Zobacz rozdział 13.2.6, "LOAD DATA INFILE Składnia".
...
WSTAW jest nadal dużo wolniejszy w ładowaniu danych niż LOAD DATA INFILE, nawet przy użyciu strategii przedstawionych w zarysie.

LOAD DATA INFILE '/path/to/your/file.csv' 
INTO TABLE contacts 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' -- or '\r\n' 
IGNORE 1 LINES; -- use IGNORE if you have a header line in your file 
3

Wystarczy wypłukać odpowiedź @ peterm, oto jest funkcją, która ładuje data.frame do MySQL za pośrednictwem LOAD DATA INFILE:

saveData <- function(data, # a data frame 
        tableName, # table name, possibly qualified (e.g. "my_db.customers") 
        ...) # arguments to DBI::dbConnect 
        { 

    query <- sprintf("LOAD DATA INFILE '%s' 
INTO TABLE %s 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' -- or '\r\n' 
IGNORE 1 LINES;" , TEMPFILE,tableName) 

    # WRITE THE DATA TO A LOCAL FILE 
    TEMPFILE <- tempfile(fileext='.csv') 
    write.csv(data,TEMPFILE) 
    on.exit(file.remove(TEMPFILE)) 

    # CONNECT TO THE DATABASE 
    db <- dbConnect(MySQL(), ...) 

    # SUBMIT THE UPDATE QUERY AND DISCONNECT 
    dbGetQuery(db, query) 
    dbDisconnect(db) 
} 
Powiązane problemy