如何在 R 中按块从数据库中读取数据?

How to read data from a database by chunk in R?

在 dplyr 中,如果 tbl 是数据库中的 table,则 head(tbl) 会被翻译成

select
  *
from
  tbl
limit 6

但似乎没有办法使用 offset 关键字来分块读取数据。例如。相当于

select
  *
from
  tbl
limit 6 offset 5

dplyr 似乎不可能。在dbplyr里面有一个do的功能可以让你选择一个chunk_size来逐块的带回数据。

这是在 R 中执行此操作的唯一方法吗?解决方案不必在 dplyrtidyverse.

我在 dbplyr 中的做法是基于添加 reference/ID 列:

my_tbl = tbl(con, "table_name")

for(i in 1:100){
  sub_tbl = my_tbl %>% filter(ID %% 100 == i)

  # further processing using 'sub_tbl'
  ...
}

如果您向数据集添加行号,则您的过滤器可以替换为 filter(LowerBound < row_number & row_number < UpperBound)

另一种方法是构建您自己的偏移函数。这假设您的数据库支持它,并且该功能不太可能转移到其他类型的数据库。

类似于以下内容:

offset_head = function(table, num, offset){

  # get connection
  db_connection = table$src$con

  sql_query = build_sql(con = db_connection,
                      sql_render(table),
                      "\nLIMIT ", num,
                      "\nOFFSET ", offset
  )

  return(tbl(db_connection, sql(sql_query)))
}