2013-07-15 40 views
5

có gói: RMySQLR tải lên hàng loạt dữ liệu vào cơ sở dữ liệu MYSQL

Làm cách nào để tải lên hàng loạt dữ liệu đến mysql từ R? Tôi có một csv với khoảng 1 triệu dòng và 80 cột.

Điều gì đó giống như công việc này?

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

Tôi lo sợ này chèn từng dòng ...

+0

Tôi cũng xem xét các công cụ dòng lệnh cho mysql như một sự thay thế. –

+1

Ngoài ra còn có các GUI của MySQL như Sequel Pro (dành cho Mac) và Heidi SQL (dành cho cửa sổ) cần có tùy chọn nhập csv ... – Carson

+1

Nếu dữ liệu của bạn nằm ngoài R và bạn sẽ gửi nó đến đích bên ngoài R, bạn không nên bị R tham gia. Điều đó sẽ chỉ làm chậm mọi thứ và giới thiệu rất nhiều bước trung gian có thể đi sai. Một điều bạn _can_ làm trong R là tải chỉ vài dòng đầu tiên để kiểm tra các tiêu đề và các kiểu cột. Điều đó có thể hữu ích để đảm bảo bạn có cấu trúc bảng đúng. –

Trả lời

3

Nếu bạn đang chèn nhiều hàng từ cùng một khách hàng cùng một lúc, bạn có thể sử dụng câu lệnh INSERT với nhiều GIÁ TRỊ

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

Đây là một ví dụ về cách tạo truy vấn của bạn. Tôi đang sử dụng data.table đây:

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) 

sau đó bạn có thể thực hiện nó bằng cách sử dbGetQuery:

dbGetQuery(con, query) 
+0

cũng là một cách tiếp cận thú vị! Tôi sẽ thử nó và so sánh tốc độ – user670186

+1

điều này thật tuyệt! chính xác những gì tôi cần! – marbel

+1

Câu trả lời này không hoạt động nếu dữ liệu của bạn nằm trong data.frame b/c 't (myData)' không có ý nghĩa đối với data.frames nói chung. – Jthorpe

5

Vì bạn có nhiều dữ liệu xem xét sử dụng LOAD DATA. Đó là phương pháp nhập dữ liệu nhanh nhất từ ​​một tệp tin theo tài liệu mysql.

LOAD DATA INFILE
Các LOAD DATA tuyên bố INFILE đọc các hàng từ một file văn bản vào một bảng với tốc độ rất cao.

Speed of INSERT Statements
Khi tải bảng từ tệp văn bản, hãy sử dụng LOAD DATA INFILE. Đây là thường nhanh hơn 20 lần so với sử dụng câu lệnh INSERT. Xem Phần 13.2.6, “Cú pháp LOẠI DATA INFILE”. ...
INSERT vẫn còn chậm hơn nhiều để tải dữ liệu hơn LOAD DATA INFILE, ngay cả khi sử dụng các chiến lược vừa nêu.

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

Chỉ cần để tuôn ra câu trả lời @ peterm của, đây là một chức năng mà tải một data.frame vào MySQL qua 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) 
} 
Các vấn đề liên quan