r - 使用 dbplyr 跨数据库连接

标签 r database dplyr src dbplyr

我正在使用 dbplyr 处理数据库表

我有一个本地表,想将它与数据库中的一个大表(150m 行)连接起来

数据库PRODUCTION是只读的

# Set up the connection and point to the table

library(odbc); library(dbplyr)    

my_conn_string <- paste("Driver={Teradata};DBCName=teradata2690;DATABASE=PRODUCTION;UID=",
                            t2690_username,";PWD=",t2690_password, sep="")

t2690 <- dbConnect(odbc::odbc(), .connection_string=my_conn_string)

order_line <- tbl(t2690, "order_line") #150m rows

我也有一个本地表,我们称它为订单

# fill df with random data

orders <- data.frame(matrix(rexp(50), nrow = 100000, ncol = 5))

names(orders) <- c("customer_id", paste0(rep("variable_", 4), 1:4))

假设我想加入这两个表,我收到以下错误:

complete_orders <- orders %>% left_join(order_line)

> Error: `x` and `y` must share the same src, set `copy` = TRUE (may be slow)

问题是,如果我设置copy = TRUE,它会尝试下载整个order_line,我的电脑很快就会耗尽内存

另一种选择是将 orders 表上传到数据库。这里的问题是 PRODUCTION 数据库是只读的——我必须上传到不同的数据库。尝试在 dbplyr 中跨数据库复制会导致相同的错误。

我找到的唯一解决方案是上传到可写数据库并使用sql将它们连接起来,这远非理想

最佳答案

我找到了答案,您可以在 tbl 指针中使用 in_schema() 函数在同一连接中跨模式工作

# Connect without specifying a database
my_conn_string <- paste("Driver={Teradata};DBCName=teradata2690;UID=",
                            t2690_username,";PWD=",t2690_password, sep="")    

# Upload the local table to the TEMP db then point to it
orders <- tbl(t2690, in_schema("TEMP", "orders"))

order_line <-  tbl(t2690, in_schema("PRODUCTION", "order_line"))

complete_orders <- orders %>% left_join(order_line)

关于r - 使用 dbplyr 跨数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50327140/

相关文章:

r - 如何使用 dplyr 和数据框在 R 中创建百分位数?

R data.frame 到表格图像以进行演示

r - 在r中将街道地址分为街道编号和街道名称

r - 测试模型参数的整洁方法

r - dplyr : use mutate with columns that contain lists

r - 使用 f(myclass.myfunc) 语法将函数传递给 R

database - Django 通用外键字段在构造期间未分配,但可以在构造后分配

c# - 测试条件如何基于查询结果的计数?

sql - 主键还是唯一索引?

重置 ggplot 分面每列中的颜色