3

我使用 dplyr 从 sql 数据库中获取数据,它通常工作得很好。

但有时我的代码运行速度很慢,我不知道为什么。大多数时候我连接到具有 100 万行的表,我过滤一些数据,然后我使用这样的收集功能

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 但它很慢。

4

1 回答 1

0

这是因为惰性评估。这部分只计划工作:

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()

只有当您运行 collect 时,才会执行查询并传输数据:

flights %>% 
  collect()
于 2020-12-09T14:34:13.667 回答