4

テーブルreg_dataは PostgreSQL テーブルです。PostgreSQL で回帰を実行する方が高速であることが判明しました。しかし、何十万ものデータセットに対して実行しているので、データセットごとにデータセットを実行し、それぞれの結果をテーブルに追加したいと考えています。

dplyrネイティブ動詞を使用して PostgreSQL データを PostgreSQL テーブルに追加する方法はありますか? データを R に持ってきてから PostgreSQL に送り返すのに莫大なコストがかかるかどうかはわかりませんが (6 つの数字と 2 つの識別フィールドだけです)、洗練されていないように見えます。

library(dplyr)

pg <- src_postgres()

reg_data <- tbl(pg, "reg_data")

reg_results <-
    reg_data %>%
    summarize(r_squared=regr_r2(y, x),
              num_obs=regr_count(y, x),
              constant=regr_intercept(y, x),
              slope=regr_slope(y, x),
              mean_analyst_fog=regr_avgx(y, x),
              mean_manager_fog=regr_avgy(y, x)) %>%
    collect() %>%
    as.data.frame()

# Push to database.
dbWriteTable(pg$con, c("bgt", "within_call_data"), reg_results,
             append=TRUE, row.names=FALSE)
4

2 に答える 2

4

dplyrデータベースにレコードを挿入または更新するコマンドが含まれていないため、dplyrこれに対する完全なネイティブ ソリューションはありません。ただし、dplyr を通常の SQL ステートメントと組み合わせて、データを R に持ち込まないようにすることができます。

collect()ステートメントの前の手順を再現することから始めましょう

library(dplyr)

pg <- src_postgres()

reg_data <- tbl(pg, "reg_data")

reg_results <-
    reg_data %>%
    summarize(r_squared=regr_r2(y, x),
              num_obs=regr_count(y, x),
              constant=regr_intercept(y, x),
              slope=regr_slope(y, x),
              mean_analyst_fog=regr_avgx(y, x),
              mean_manager_fog=regr_avgy(y, x))

これで、データベースに一時テーブルを作成するcompute()代わりに使用できるようになりました。collect()

temp.table.name <- paste0(sample(letters, 10, replace = TRUE), collapse = "")

reg_results <- reg_results %>% compute(name=temp.table.name)

はランダムtemp.table.nameなテーブル名です。計算のオプションname = temp.table.nameを使用して、このランダムな名前を、作成された一時テーブルに割り当てます。

次に、ライブラリRPostgreSQLを使用して、一時テーブルに格納された結果を使用する挿入クエリを作成します。一時テーブルはによって作成された接続にのみ存在src_postgresql()するため、再利用する必要があります。

library(RPostgreSQL)
copyconn <- pg$con
class(copyconn) <- "PostgreSQLConnection" # I get an error if I don't fix the class

最後に挿入クエリ

sql <- paste0("INSERT INTO destination_table SELECT * FROM ", temp.tbl.name,";")

dbSendQuery(copyconn, sql)

したがって、すべてがデータベースで行われ、データは R に取り込まれません。

編集

この投稿の以前のバージョンでは、temp.tbl.nameから取得したときにカプセル化が壊れていましたreg_resultsname=これは、computeのオプションを使用して回避されます。

于 2016-08-30T08:04:16.230 に答える