有没有更快的方法将数据从 R 上传到 MySql?
Is there a faster way to upload data from R to MySql?
我正在使用以下代码将新的 table 上传到 mysql 数据库。
library(RMySql)
library(RODBC)
con <- dbConnect(MySQL(),
user = 'user',
password = 'pw',
host = 'amazonaws.com',
dbname = 'db_name')
dbSendQuery(con, "CREATE TABLE table_1 (
var_1 VARCHAR(50),
var_2 VARCHAR(50),
var_3 DOUBLE,
var_4 DOUBLE);
")
channel <- odbcConnect("db name")
sqlSave(channel, dat = df, tablename = "tb_name", rownames = FALSE, append =
TRUE)
完整的数据集是 68 个变量和 500 万行。将 5 万行上传到 MySql 需要 90 多分钟。有没有更有效的方法将数据上传到MySql。我最初尝试 dbWriteTable()
但这会导致出现一条错误消息,指出与数据库的连接已丢失。
您可以尝试禁用 mysql 查询日志:
dbSendQuery(con, "SET GLOBAL general_log = 'off'")
我无法判断您的 mysql 用户帐户是否具有执行此操作的适当权限,或者它是否与您的业务需求冲突。
我没想到:否则你可以尝试以 1000 行的批次发送数据,在你的 Rscript 中使用 for- 循环,也许在你调用 sqlSave
如果您在单个批次中发送数据,Mysql 可能会尝试 运行 INSERT 作为单个事务 ("all-or-nothing"),如果失败则进入恢复或在插入一些随机行数后就失败了。
考虑使用 LOAD DATA INFILE
:
从 R 导出 CSV 以导入到 MySQL
...
write.csv(df, "/path/to/filename.csv", row.names=FALSE)
dbSendQuery(con, "LOAD DATA LOCAL INFILE '/path/to/filename.csv'
INTO TABLE mytable
FIELDS TERMINATED by ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'")
我正在使用以下代码将新的 table 上传到 mysql 数据库。
library(RMySql)
library(RODBC)
con <- dbConnect(MySQL(),
user = 'user',
password = 'pw',
host = 'amazonaws.com',
dbname = 'db_name')
dbSendQuery(con, "CREATE TABLE table_1 (
var_1 VARCHAR(50),
var_2 VARCHAR(50),
var_3 DOUBLE,
var_4 DOUBLE);
")
channel <- odbcConnect("db name")
sqlSave(channel, dat = df, tablename = "tb_name", rownames = FALSE, append =
TRUE)
完整的数据集是 68 个变量和 500 万行。将 5 万行上传到 MySql 需要 90 多分钟。有没有更有效的方法将数据上传到MySql。我最初尝试 dbWriteTable()
但这会导致出现一条错误消息,指出与数据库的连接已丢失。
您可以尝试禁用 mysql 查询日志:
dbSendQuery(con, "SET GLOBAL general_log = 'off'")
我无法判断您的 mysql 用户帐户是否具有执行此操作的适当权限,或者它是否与您的业务需求冲突。
我没想到:否则你可以尝试以 1000 行的批次发送数据,在你的 Rscript 中使用 for- 循环,也许在你调用 sqlSave
如果您在单个批次中发送数据,Mysql 可能会尝试 运行 INSERT 作为单个事务 ("all-or-nothing"),如果失败则进入恢复或在插入一些随机行数后就失败了。
考虑使用 LOAD DATA INFILE
:
...
write.csv(df, "/path/to/filename.csv", row.names=FALSE)
dbSendQuery(con, "LOAD DATA LOCAL INFILE '/path/to/filename.csv'
INTO TABLE mytable
FIELDS TERMINATED by ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'")