Объединение баз данных с помощью dbplyr - PullRequest
0 голосов
/ 14 мая 2018

Я работаю с таблицами базы данных с помощью 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 для присоединения к ним, что далеко от идеала

1 Ответ

0 голосов
/ 22 мая 2018

Я нашел ответ, вы можете использовать функцию in_schema() в указателе tbl для работы со схемами в одном соединении

# 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)
...