5

有包:RMySQL

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

像这样的东西会起作用吗?

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

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

4

3 回答 3

6

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

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

INSERT 语句的速度
从文本文件加载表时,使用 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
于 2013-07-15T03:45:48.267 回答
4

如果您同时从同一个客户端插入许多行,您可以使用带有多个 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)
于 2013-07-15T03:40:07.553 回答
3

只是为了刷新@peterm的答案,这是一个通过以下方式将data.frame加载到MySQL中的函数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)
}
于 2015-11-17T23:47:51.137 回答