sql - 在 R 中到达分布在多个 Postgres 服务器中的分片数据
问题描述
我在 3 个不同的 Postgres 服务器中有 3 个分片数据库,我正在尝试连接这些服务器并编写一个 sql 以在 R 中返回一个值。我可以连接并编写第一个查询,但我需要来自这三个服务器的数据结果桌子在一起。我该怎么做?
require("RPostgreSQL")
library(DBI)
library('dplyr')
# password
pw <- "postgres"
# loads the PostgreSQL driver
drv <- dbDriver("PostgreSQL")
# creates a connection to the postgres database
con1 <- dbConnect(
drv,
dbname = "postgres",
host = "0.0.0.0",
port = 5436,
user = "postgres",
password = pw
)
con2 <- dbConnect(
drv,
dbname = "postgres",
host = "0.0.0.0",
port = 5431,
user = "postgres",
password = pw
)
con3 <- dbConnect(
drv,
dbname = "postgres",
host = "0.0.0.0",
port = 5436,
user = "postgres",
password = pw
)
rm(pw) # removes the password
# check for connection
dbExistsTable(con1, "shard1")
dbExistsTable(con2, "shard2")
dbExistsTable(con3, "shard3")
# TRUE
# the amount of paid installs by company, which happened in May
query = "SELECT company, SUM(installs)
FROM shard1
WHERE paid= 'TRUE' AND to_char(created_at,'mm')='05'
GROUP BY company"
dsub = tbl(con1, sql(query))
dsub
解决方案
只需行绑定所有生成的数据帧。由于名称以 1-2-3 模式更改,get()
因此在 SQL 查询中用于表名的连接对象和字符串插值,两者都使用以下方式动态引用paste0
:
# RETURN LIST DATA FRAMES FOR EACH CONNECTION
df_list <- lapply(c(1:3), function(i) {
query <- "SELECT company, SUM(installs) AS total_installs
FROM %s
WHERE paid = 'TRUE'
AND to_char(created_at,'mm')='05'
GROUP BY company"
dbGetQuery(get(paste0("con", i)), sprintf(query, paste0("shard", i)))
})
final_df <- do.call(rbind, df_list) # BASE R CHAIN APPEND METHOD
# final_df <- bind_rows(df_list) # DPLYR CHAIN APPEND METHOD
推荐阅读
- delphi - Delphi 正确签名 LowLevelKeyboardProc()
- fetch - 获取失败时如何获得更明确的错误消息?
- python - 在 python 中使用 for 循环遍历文本文件 - 为什么会这样?
- python - 当没有“更多”按钮时,向下滚动到网页末尾时,单击使用 python selenium 动态加载的链接
- node.js - 对于模型“modelName”的路径“_id”处的值“{ populate: [] }”,转换为 ObjectId 失败。NodeJS 猫鼬
- azure - 将 VM 映像复制到 Blob 存储
- excel - 使用 Excel 条件格式检查日期
- c++ - 在 C/C++ 中将数组作为形式参数作为 int arr[] 和 int arr[N] 传递的区别
- javascript - 页面加载时的变量重置
- docker - 如何配置 Node-RED Docker 将输出文件写入“数据”目录?