使用dbplyr跨数据库连接

时间:2018-05-14 09:31:29

标签: r database dplyr src dbplyr

我正在使用dbplyr

的数据库表

我有一个本地表,想要在数据库中加入一个大的(150米行)表

数据库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加入它们,这远非理想

2 个答案:

答案 0 :(得分:1)

我找到了答案,你可以使用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)

答案 1 :(得分:0)

<块引用>

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

在您的用例中,您的数据库似乎(基于接受的答案)位于同一台服务器上,这只是使用 in_schema 的问题。如果不是这种情况,另一种方法是给定 here,这实际上提供了一个适用于只读连接的 copy_to 版本。