【问题标题】:dplyr Filter Database Table with Large Number of Matchesdplyr 过滤具有大量匹配的数据库表
【发布时间】:2017-08-24 18:13:04
【问题描述】:

我正在使用dplyrdbplyr 包来连接我的数据库。我有一张包含数百万条记录的表。我还有一个值列表,这些值对应于我希望过滤的同一个表中的键。通常我会做这样的事情来过滤表格。

library(ROracle)

# connect info omitted
con <- dbConnect(...)

# df with values - my_values

con %>% tbl('MY_TABLE') %>% filter(FIELD %in% my_values$FIELD)

但是,my_values 对象包含超过 500K 的条目(因此我不在这里提供实际数据)。当它们基本上被放入IN 语句(它基本上挂起)时,这显然是没有效率的。通常,如果我正在编写 SQL,我会创建一个临时表并编写一个 WHERE EXISTS 子句。但在这种情况下,我没有写权限。

如何使这个查询在 R 中更高效?

【问题讨论】:

  • 可能是内部连接?

标签: r database dplyr dbplyr


【解决方案1】:

请注意这是否会有所帮助,但有一些建议:

  1. 查找其他过滤条件。例如,如果my_values$FIELD 是连续的,或者值列表可以由其他一些列推断,您可以通过between 过滤器寻求帮助:filter(between(FIELD, a, b))?
  2. 分而治之。将my_values 拆分成小批次,对每个批次进行查询,然后合并结果。这可能需要一段时间,但应该是稳定的,值得等待。

【讨论】:

  • 感谢您的回复,不幸的是这些值不是连续的,因此选项 1 已失效。选项 2 应该可行,但我希望这里有其他可能性。
【解决方案2】:

查看您的限制,我会以类似于 Polor Beer 建议的方式处理它,但我会使用 purrr::map 为每个值发送一个 db 命令,然后在最后使用 dplyr::bindrows()。这样,您将拥有一个很好的管道代码,如果您的列表发生更改,它将适应。不理想,但除非您愿意手动编写 SQL 表变量,否则不确定是否有任何其他解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多