有包:RMySQL
如何从R批量上传大量数据到mysql?我有一个大约100万行和80列的csv。
这样的事情会起作用吗?
dbWriteTable(con, "test2", "~/data/test2.csv") ## table from a file
我担心这会逐行插入......
答案 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)
}