Не полный ответ, но подробности моего исследования, чтобы спасти людей от повторения моих шагов.
Тайм-аут не кажется управляемым через dbplyr
dbconnect
принимает и драйвер, и аргументы для передачи драйверу ( документация ): dbConnect(drv, ...)
. - Для некоторых типов подключения дополнительные аргументы могут включать
timeout
. В этой проблеме есть пример использования Cassandra: con <- dbConnect(odbc::odbc(), "Cassandra (DSN)", timeout = 10)
. - Однако тайм-аут не поддерживается в качестве аргумента для
bigquery
. В документации перечислены следующие аргументы (project
, dataset
, billing
, page_size
, quiet
, use_legacy_sql
, bigint
) и отмечается, что другие аргументы в настоящее время игнорируются.
Итак, учитывая вышесказанное, маловероятно, что тайм-аут может контролироваться R через dbplyr
, DBI
или соединение.
Разделение запроса на несколько более коротких запросов
Хотя это не является предпочтением OP (комментарии проясняют), это все же потенциальное решение. Я использую подход фильтрации, основанный на столбце уникального идентификатора, с функцией-оболочкой, чтобы уменьшить дополнительный беспорядок:
reconnect <- function(jj){
if(exists("connection"))
dbDisconnect(connection) # avoids multiple concurrent connections
print(paste0(as.character(Sys.time()),"-- modulo ",jj," begun")) # track progress
connection <- dbConnect(
bigrquery::bigquery(),
project = "your-gcp-project-id",
dataset = "dataset-name",
billing = billing
)
mytable <- tbl(connection, "mytable") %>%
filter(unique_id %% NUM_SUBSETS == jj) # filter to subset, requires unique_id
# assignment into the parent environment
assign("connection", connection, envir = parent.frame())
assign("mytable ", mytable , envir = parent.frame())
}
Затем мы выполняем итерацию следующим образом:
## parameters
DEVELOPMENT_MODE = FALSE
NUM_SUBSETS = 50
## subset
modulo = if(DEVELOPMENT_MODE){ modulo = 0 # only one if development mode
} else { modulo = 0:(NUM_SUBSETS-1) # otherwise all of them
}
results = data.frame()
for(jj in modulo){
reconnect(jj)
these_results = mytable %>%
-- some heavy dplyr wrangling --
%>% collect()
results = rbind(results, these_results)
}
I установите для DEVELOPER_MODE
значение true при тестировании / разработке и значение false, если я хочу, чтобы все это работало.
Другие возможности для рассмотрения
- Проверить, можно ли установить / контролировать время ожидания в аккаунте bigquery (если им нельзя управлять через R).
- Исследование сложности
-- heavy dplyr wrangling here --
. Поскольку dbplyr не транслирует очень эффективный код sql, в моей работе над сервером SQL сохранение промежуточных таблиц сократило мои часы работы. Учитывая, что загрузка 10 ГБ должна быть намного быстрее, чем несколько часов, узким местом может быть большой запрос, выполняющий все споры на лету (и что первоначальное 20-секундное выполнение выполняется с ленивой оценкой). Эта ссылка предполагает, что продолжительность одного выполнения ограничена шестью часами.