如何通过R中的块从数据库读取数据?

时间:2019-08-26 03:29:03

标签: r dplyr dbplyr

在dplyr中,如果tbl是数据库中的表,则head(tbl)被转换为

select
  *
from
  tbl
limit 6

但是似乎没有一种方法可以使用offset关键字来分块读取数据。例如。相当于

select
  *
from
  tbl
limit 6 offset 5
使用dplyr似乎无法实现

。在dbplyr中,有一个do函数可让您选择一个chunk_size逐块带回数据。

这是在R中做到这一点的唯一方法吗?该解决方案不必位于dplyrtidyverse中。

2 个答案:

答案 0 :(得分:1)

我在dbplyr中完成此操作的方式基于添加的引用/ 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)

答案 1 :(得分:1)

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

类似以下内容:

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