Anti_join() de base local com base remota Posgres

Dúvida de PostgreSQL

  • Eu tenho uma base local base_local com a coluna id
  • Eu tenho uma base remota num postgres base_remota com a coluna id, que li rodando
base_remota <- dplyr::tbl(con, "base_remota")

Eu gostaria de fazer um anti_join(base_local, base_remota, "id"), ou seja, tirar da minha base_local os id's que já estão na base_remota.

Quando faço isso, no entanto, o que observo é:

novos <- dplyr::anti_join(base_local, base_remota, "id")
#> Error: `x` and `y` must share the same src, set `copy` = TRUE (may be slow).

No entanto, como minha base local é muito menor que a remota, queria fazer isso direto no sem precisar colocar copy = TRUE, direto no postgres.

O jeito que pensei em fazer isso é 1) subir base_local para o postgres, 2) ler base_local_remota do postgres e 3) fazer o anti_join() de lá para só então dar collect()

O que é melhor? copy=TRUE ou o jeito que pensei? Existe uma terceira forma mais eficiente?

Obrigado!

Acho que essas são as duas formas de fazer mesmo…

O que daria para otimizar seria, por exemplo, na 1 se sua base tiver mtas colunas vc pode subir só o id:

dplyr::anti_join(dplyr::copy_to(con, base_local %>% dplyr::select(id)), base_remota, "id") %>% left_join(base_local) 

A mesma coisa na 2, ao invés de baixar a base inteira, poderia só pegar o id

1 curtida

Uma solução seria esta:

query <- glue::glue_sql("
                       select id from base_remota where id in ({base_local$id*})
                       ",.con  = conn)

ids_remotos <- DBI::dbGetQuery(conn,query)

base_local <- dplyr::anti_join(base_local, ids_remotos, by = "id")
1 curtida