【问题标题】:Best approach to combine multiple MySQL tables in R在 R 中组合多个 MySQL 表的最佳方法
【发布时间】:2017-12-08 11:09:47
【问题描述】:

在 R 中组合多个 MySQL 表的最佳方法是什么?例如,我需要rbind 14 个大型`MySQL 表(每个 >100k 行乘 100 列)。我尝试了以下方法,它消耗了我的大部分内存并从 MySQL 中获得了时间。我想知道是否有替代解决方案?我不需要获取整个表格,只需将整个表格按几个变量分组并计算一些指标。

station_tbl_t <- dbSendQuery(my_db, "select * from tbl_r3_300ft
                  union all
                  select * from tbl_r4_350ft
                  union all
                  select * from tbl_r5_400ft
                  union all
                  select * from tbl_r6_500ft
                  union all
                  select * from tbl_r7_600ft
                  union all
                  select * from tbl_r8_700ft
                  union all
                  select * from tbl_r9_800ft
                  union all
                  select * from tbl_r10_900ft
                  union all
                  select * from tbl_r11_1000ft
                  union all
                  select * from tbl_r12_1200ft
                  union all
                  select * from tbl_r13_1400ft
                  union all
                  select * from tbl_r14_1600ft
                  union all
                  select * from tbl_r15_1800ft
                  union all
                  select * from tbl_r16_2000ft
                  ")

【问题讨论】:

  • 在每个选择上使用 where 子句来限制返回的行,如果需要汇总数据(连同 SUM、MAX 等)函数以组合结果中的行,则使用 group by。
  • @SloanThrasher,感谢您的建议。所以这必须通过dbSendQuery来完成,没有dplyr函数,对吧?
  • 这可以使用 dplyr/dbplyr 来完成(请参阅最近的 RStudio blog post 作为起点)。但我会继续使用您通过 SQL 构建较小的所需数据集的方法(在合并 @SloanThrasher 的建议之后)。不要忘记通过明确列出列来限制列(而不是使用*)。
  • @wibeasley,感谢您的提示!

标签: mysql r dplyr rmysql


【解决方案1】:

考虑迭代导入 MySQL 表数据,然后使用 R 进行行绑定。并确保选择需要的列以节省开销:

tbls <- c("tbl_r3_300ft", "tbl_r4_350ft", "tbl_r5_400ft", 
          "tbl_r6_500ft", "tbl_r7_600ft", "tbl_r8_700ft", 
          "tbl_r9_800ft", "tbl_r10_900ft", "tbl_r11_1000ft", 
          "tbl_r12_1200ft", "tbl_r13_1400ft", "tbl_r14_1600ft", 
          "tbl_r15_1800ft", "tbl_r16_2000ft")

sql <- "SELECT Col1, Col2, Col3 FROM" 

dfList <- lapply(paste(sql, tbls), function(s) {
             tryCatch({ return(dbGetQuery(my_db, s)) 
                      }, error = function(e) return(as.character(e)))
          })

# ROW BIND VERSIONS ACROSS PACKAGES
master_df <- base::do.call(rbind, dfList)
master_df <- plyr::rbind.fill(dfList)
master_df <- dplyr::bind_rows(dfList)
master_df <- data.table::rbindlist(dfList)

【讨论】:

  • lapply 语句中得到这个错误,Error in .local(conn, statement, ...) : connection with pending rows, close resultSet before continuing
  • 哎呀!我忘记了一个右括号。再试一次。我们可能需要使用tryCatch()
  • 感谢您的建议。仍然有同样的错误。也许是因为lapply?那么需要不断检查循环中的连接吗?
  • 啊哈!实际上是dbSendQuery(),之后我们需要fetch()。假设您使用 RMySQL,请参阅使用 dbGetQuery() 编辑(all)。我还添加了tryCatch()。在行绑定之前,评估 dfList 以查看是否所有表都通过了。
  • 根据需要进行调整。如果内存请求无法处理,您将收到警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2023-03-03
  • 2016-07-06
  • 2020-04-17
相关资源
最近更新 更多