R批量上传数据到MYSQL数据库

时间:2013-07-15 02:41:38

标签: mysql r bulkinsert bulk-load rmysql

有包:RMySQL

如何从R批量上传大量数据到mysql?我有一个大约100万行和80列的csv。

这样的事情会起作用吗?

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

我担心这会逐行插入......

3 个答案:

答案 0 :(得分:5)

由于您有大量数据,请考虑使用LOAD DATA。它是根据mysql文档从文件导入数据的最快方法。

  

LOAD DATA INFILE
  LOAD DATA INFILE语句将文本文件中的行以非常高的速度读取到表

     

Speed of INSERT Statements
  从文本文件加载表时,请使用LOAD DATA INFILE。 这是   通常比使用INSERT语句快20倍。见章节   13.2.6,“LOAD DATA INFILE语法”。
  ...
  加载数据的INSERT仍然比LOAD DATA INFILE 慢得多,即使使用刚刚概述的策略也是如此。

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

答案 1 :(得分:3)

如果要同时从同一客户端插入多行,可以使用具有多个VALUES的INSERT语句

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

这里有一个关于如何创建查询的示例。我在这里使用data.table

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)

然后您可以使用dbGetQuery执行它:

  dbGetQuery(con, query)

答案 2 :(得分:3)

只是为了清除@ peterm的答案,这是一个通过LOAD DATA INFILE将数据框加载到MySQL中的函数:

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)
}