2017-05-31 28 views
1

我正在使用以下代码将新表上载到mysql数据库中。有没有更快的方式将数据从R上传到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万行。将50万行上传到MySql需要90多分钟的时间。有没有更有效的方式将数据上传到MySql?我最初尝试dbWriteTable(),但这会导致一条错误消息,指出与数据库的连接已丢失。

+1

是的,它们对应的命令行装载机经常推荐用于MySQL和PostgreSQL,...作为过程批量更新更好(可能是逐行)操作'sqlSave()'或'dbWriteTable()'。 –

回答

1

考虑从R A CSV导出为导入到MySQL与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'") 
+0

当我使用这个方法时,我得到错误'.local(conn,statement,...)中的错误:无法运行语句:在查询过程中丢失与MySQL服务器的连接。有什么建议么? – roarkz

+0

嗯......把这个查询放在一个.sql脚本中,并通过[MySQL cli]运行它(https://stackoverflow.com/questions/8940230/how-can-i-run-a-sql-text-file- on-a-mysql-database)(黑盒命令行)。你会用'source /path/to/filename.sql; '如果这个成功运行,R是问题。 – Parfait

+0

因此,我尝试了'SET GLOBAL local_infile = 1;'并且出现了“拒绝访问”错误,所以看起来问题在于我的权限。感谢所有的帮助! – roarkz

0

你可以尝试禁用MySQL查询日志:

dbSendQuery(con, "SET GLOBAL general_log = 'off'") 

我不能告诉如果你的MySQL用户帐户具有相应的权限,要做到这一点,或者如果它与您的业务需求相冲突。

关闭我的头顶:否则,你可以尝试在说1000行批量发送的数据,在你RSCRIPT使用for循环,也许选项verbose = true在调用sqlSave

如果您在一次批量发送数据时,Mysql可能会尝试将INSERT作为单个事务运行(“全有或全无”),如果失败则进入恢复过程,或者在插入一些随机数的行后失败。

相关问题