R - TBL / собирать иногда медленно
Я использую dplyr для получения данных из базы данных SQL, и это обычно работает довольно хорошо.
Но иногда мой код работает очень медленно, и я не уверен почему. Большую часть времени я подключаюсь к таблицам с 1 миллионами строк, фильтрую некоторые данные и затем использую функцию сбора, подобную этой
flights <- tbl(
getDbConn("flight_data"),
in_schema(
"flights",
"usa")
) %>%
filter(destination == "east_coast") %>%
filter(city %in% c("NYC", "MIA") == F) %>%
filter(passanger_id %in% passangers$id) %>%
select(city, passanger_id, date) %>%
collect()
Загрузка данных из базы данных занимает всего несколько секунд. Но иногда мой код очень медленный, и я не знаю почему. Это может быть связано с тем, какие данные хранятся в базе данных, например, со временем. В этом случае требуется 10 минут для загрузки данных с тем же кодом, что и выше.
Единственное, что всегда работает быстро
flights <- tbl(
getDbConn("flight_data"),
in_schema(
"flights",
"other_table")
) %>%
select(city, passanger_id, date)
Код выше работает несколько секунд. Но как только я использую собирать с этими данными, это медленно - 10 минут или больше. Мне интересно, есть ли быстрая альтернатива для сбора? Я попытался tbl_df, но это похоже медленно.
1 ответ
Это из-за ленивой оценки. Эта часть только планирует работу:
flights <- tbl(
getDbConn("flight_data"),
in_schema(
"flights",
"usa")
) %>%
filter(destination == "east_coast",
city %in% c("NYC", "MIA"),
passanger_id %in% passangers$id) %>%
select(city, passanger_id, date)
Вы можете увидеть запрос, который вы фактически создали:
flights %>%
show_query()
Только когда вы запускаете сбор, запрос выполняется и данные передаются:
flights %>%
collect()