R и dplyr - как написать эффективный код для загрузки данных из базы данных - PullRequest
0 голосов
/ 04 июля 2019

Я использую dbplyr для получения данных из нашей базы данных sql. В основном я работаю так:

1) Я загружаю те же данные из одной таблицы, например:

flights <- 
  tbl(delta, "us") %>% 
  select(id, origin) %>% 
  collect()

2) Затем я использую эти данные для фильтрации данных из других таблиц и т. Д.

passangers <-
  tbl(customers, "all") %>% 
  filter(flight_id %in% flights$id) %>% 
  filter(year == "2018") %>% 
  collect()

payments <- 
      tbl(incoming_payments, "all") %>% 
      filter(flight_id %in% flights$id) %>% 
      filter(year == "2018") %>% 
      collect()

contact_data <-
      tbl(emails, "all") %>% 
          filter(customer_id %in% passangers $id) %>% 
          filter(type == "email") %>% 
          collect()

Это работает хорошо, пока мне не нужно загружать данные из большего количества таблиц. С этого момента я создаю фрейм данных для каждого запроса, и я знаю, как загружать данные из одной таблицы одним запросом. Я создаю очень много фреймов данных, и код повторяется даже в этом простом примере.

Таким образом, мой вопрос, есть ли способ, как написать идеальный запрос более просто в идеале только с одним созданным фреймом данных. Но с возможностью фильтрации данных, как я (я фильтрую только flight_ids, которые присутствуют в фрейме данных о рейсах и т. Д.)

1 Ответ

0 голосов
/ 04 июля 2019

Я не знаком с tbl(), будет ли это работать?

table_names = c("customers","incoming_payments","emails")

extractFilter = function(x)
  tbl(x,"all") %>%  #eval(x) here?
  filter(flight_id %in% flights$id) %>% 
  filter(year == "2018") %>% 
  collect()


results = lapply(table_names,extractFilter)

Таким образом, вы получите все фреймы данных в списке результатов. Вы можете присоединиться к ним, добавив трубу к purr::reduce(full_join,by="join_variable")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...