我正在使用dbplyr处理数据库表。
我有一个本地表,并希望将它与数据库中的一个大(150 m行)表连接起来。
数据库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连接它们,这是远远不够理想的。
发布于 2018-05-22 08:19:33
我已经找到了答案,您可以使用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)发布于 2021-06-17 14:20:55
另一种选择可以是将
orders表上载到数据库。这里的问题是,PRODUCTION数据库是只读的-我将不得不上传到另一个数据库。试图在dbplyr中跨数据库进行复制会导致相同的错误。
在您的用例中,似乎(基于公认的答案)您的数据库位于同一台服务器上,这只是一个使用in_schema的问题。如果不是这样的话,另一种方法就是给定here,它实际上提供了一个在只读连接上工作的copy_to版本。
https://stackoverflow.com/questions/50327140
复制相似问题