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()
Другие вопросы по тегам