在R中组合多个MySQL表的最佳方法

在R中组合多个MySQL表的最佳方法,mysql,r,dplyr,rmysql,Mysql,R,Dplyr,Rmysql,在R中组合多个MySQL表的最佳方法是什么?例如,我需要rbind14个大型的`MySQL表(每个>100k行乘100列)。我尝试了下面的方法,它消耗了我的大部分内存,并从MySQL中获得了时间。我想知道是否有其他的解决办法?我不需要获取整个表,只需要通过几个变量将整个表分组并计算一些度量 station_tbl_t <- dbSendQuery(my_db, "select * from tbl_r3_300ft union all

在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
                  ")

station\u tbl\u t考虑迭代导入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)

tbls考虑迭代导入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)


tbls在每个select上使用where子句来限制返回的行,如果您需要汇总数据(以及SUM、MAX等),则使用group by函数来合并结果中的行。@Sloarchasher,谢谢您的建议。所以这必须通过
dbSendQuery
,没有
dplyr
函数来完成,对吗?这可以通过dplyr/dbplyr来完成(请参阅最近的RStudio了解起点)。但我会继续使用您的方法,通过SQL构建较小的所需数据集(在合并@Sloachrisher的建议之后)。不要忘记通过显式列出列来限制列(而不是使用
*
)。@wibeasley,感谢您的提示!在每个select上使用where子句来限制返回的行,如果需要汇总数据(以及SUM、MAX等),则使用group by函数来组合结果中的行。@Sloarchasher,建议使用thx。所以这必须通过
dbSendQuery
,没有
dplyr
函数来完成,对吗?这可以通过dplyr/dbplyr来完成(请参阅最近的RStudio了解起点)。但我会继续使用您的方法,通过SQL构建较小的所需数据集(在合并@Sloachrisher的建议之后)。不要忘记通过显式列出列来限制列(而不是使用
*
)。@wibeasley,感谢您的提示!从
lappy
语句中获取此错误,
error in.local(conn,statement,…):与挂起行的连接,在继续之前关闭resultSet
Whoops!我忘了一个右括号。再试一次。我们可能需要使用
tryCatch()
。谢谢您的建议。还是有同样的错误。可能是因为拉普拉的缘故吧?所以需要继续检查循环中的连接吗?啊哈!实际上是
dbSendQuery()
之后我们需要
fetch()
。请参阅使用
dbGetQuery()
(假设使用RMySQL)进行编辑。我还添加了一个
tryCatch()
。行绑定之前,请评估dfList以查看是否所有表都已通过。根据需要进行调整。如果无法处理内存请求,将向您发出警告。从
lappy
语句中获取此错误,
error in.local(conn,statement,…):与挂起行的连接,在继续之前关闭resultSet
Whoops!我忘了一个右括号。再试一次。我们可能需要使用
tryCatch()
。谢谢您的建议。还是有同样的错误。可能是因为拉普拉的缘故吧?所以需要继续检查循环中的连接吗?啊哈!实际上是
dbSendQuery()
之后我们需要
fetch()
。请参阅使用
dbGetQuery()
(假设使用RMySQL)进行编辑。我还添加了一个
tryCatch()
。行绑定之前,请评估dfList以查看是否所有表都已通过。根据需要进行调整。如果无法处理内存请求,您将收到警告。