2017-07-04 9 views
0

Rで複数のMySQLテーブルを組み合わせる最良の方法は何ですか?例えば、私はrbindの14個の大きな `MySQLテーブル(各100k行×100列)が必要です。私は以下のアプローチを試しました。これは私の記憶の大半を消費し、MySQLからタイムアウトしました。代わりの解決策があるのでしょうか?テーブル全体をフェッチする必要はありません。テーブル全体をいくつかの変数でグループ化し、いくつかのメトリックを計算するだけです。Rで複数の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 
        ") 
+1

使用して、where句をそれぞれが返される行を制限するために選択するに、集計する必要がある場合はSUM、MAXなどのデータを集計して結果内の行を結合することができます。 –

+0

@SloanThrasher、提案のためのthx。だから、これは 'dbSendQuery'、' dplyr'関数なしで行う必要がありますか? –

+0

これは、dplyr/dbplyrを使って行うことができます(開始点については、最近のRStudio [ブログ投稿](https://blog.rstudio.org/2017/06/27/dbplyr-1-1-0/)を参照してください)。しかし、私は(SQLの@ SloanThrasherのアドバイスを組み込んだ後に)より小さなデータセットを構築するというあなたのアプローチを続けています。カラムを明示的にリストすることによって( '*'を使う代わりに)カラムを制限することを忘れないでください。 – wibeasley

答えて

2

は、反復的に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) 
+0

は 'lapply'ステートメントからこのエラーを受け取りました。' .local(conn、statement、...)のエラー: 保留中の行との接続、continueの前のresultSet' –

+0

おっと!私は閉じ括弧を忘れてしまった。再試行する。 'tryCatch()'を使う必要があるかもしれません。 – Parfait

+0

提案に感謝します。それでも同じエラーが発生しました。多分それは 'lapply'によるでしょうか?だから、ループ内の接続をチェックし続ける必要がありますか? –

関連する問題