パッケージがあります: RMySQL
R から大量のデータを mysql に一括アップロードするにはどうすればよいですか? 約 100 万行、80 列の csv があります。
このようなものは機能しますか?
dbWriteTable(con, "test2", "~/data/test2.csv") ## table from a file
これは行ごとに挿入されるのではないかと心配しています...
パッケージがあります: RMySQL
R から大量のデータを mysql に一括アップロードするにはどうすればよいですか? 約 100 万行、80 列の csv があります。
このようなものは機能しますか?
dbWriteTable(con, "test2", "~/data/test2.csv") ## table from a file
これは行ごとに挿入されるのではないかと心配しています...
同じクライアントから同時に多くの行を挿入する場合は、複数の 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)
@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)
}