【问题标题】:In is(object, Cl) : error while fetching rows R在 is(object, Cl) 中:获取行 R 时出错
【发布时间】:2015-02-26 23:56:42
【问题描述】:

我有一个 MySQL 表,我正尝试使用 RMySQL 访问 R。

有 1690004 行应该从

返回
dbGetQuery(con, "SELECT * FROM tablename WHERE export_date ='2015-01-29'")

很遗憾,我收到以下警告消息:

In is(object, Cl) : error while fetching row
In dbGetQuery(con, "SELECT * FROM tablename WHERE export_date ='2015-01-29'",  : pending rows

并且只接收约 400K 行。

如果我使用 dbSendQuery 将查询分成几个“提取”,则在收到大约 400K 行后开始出现警告消息。

任何帮助将不胜感激。

【问题讨论】:

  • 尝试使用github.com/rstats-db/RMySQL 的开发版本。如果您仍然收到错误,请创建一个可重现的示例并提交错误。
  • 我现在连连不上。使用与以前相同的连接参数,它显示 'Error in .Call("RMySQL_connection_create", PACKAGE = "RMySQL", host, user, : "RMySQL_connection_create" not available for .Call() for package "RMySQL"'
  • 最初的问题可能是由于虚拟主机限制(我尝试通过 MySQL Workbench 进行查询,但出现连接丢失错误)。

标签: mysql r rmysql


【解决方案1】:

所以,这似乎是由于我的托管服务提供商强加了 60 秒的超时(该死的 Arvixe!)。我通过“分页/分块”输出解决了这个问题。因为我的数据有一个自动递增的主键,所以返回的每一行都是有序的,允许我在每次迭代后获取接下来的 X 行。

为了获得 160 万行,我执行了以下操作:

library(RMySQL)
con <- MySQLConnect() # mysql connection function
day <- '2015-01-29' # date of interest
numofids <- 50000 # number of rows to include in each 'chunk'
count <- dbGetQuery(con, paste0("SELECT COUNT(*) as count FROM tablename WHERE export_date = '",day,"'"))$count # get the number of rows returned from the table.
dbDisconnect(con)
ns <- seq(1, count, numofids) # get sequence of rows to work over
tosave <- data.frame() # data frame to bind results to
# iterate through table to get data in 50k row chunks
for(nextseries in ns){ # for each row
  print(nextseries) # print the row it's on
  con <- MySQLConnect()
  d1 <- dbGetQuery(con, paste0("SELECT * FROM tablename WHERE export_date = '",day,"' LIMIT ", nextseries,",",numofids)) # extract data in chunks of 50k rows
  dbDisconnect(con)
  # bind data to tosave dataframe. (the ifelse is avoid an error when it tries to rbind d1 to an empty dataframe on the first pass).
  if(nrow(tosave)>0){
      tosave <- rbind(tosave, d1)
  }else{
      tosave <- d1
  }
}

【讨论】:

  • 很好的答案!当我在for 循环中添加Sys.sleep(2) 时,它对我的​​效果更好。不过有一件事; LIMIT ", nextseries,",",numofids)) 部分应为 LIMIT ", nextseries - 1,",",numofids)) 否则您将丢失整个数据集的第一行。
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 2020-12-02
  • 2022-12-19
相关资源
最近更新 更多