在dplyr中,如果tbl
是数据库中的表,则head(tbl)
被转换为
select
*
from
tbl
limit 6
但是似乎没有一种方法可以使用offset
关键字来分块读取数据。例如。相当于
select
*
from
tbl
limit 6 offset 5
使用dplyr
似乎无法实现。在dbplyr
中,有一个do
函数可让您选择一个chunk_size
逐块带回数据。
这是在R中做到这一点的唯一方法吗?该解决方案不必位于dplyr
或tidyverse
中。
答案 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)))
}