如何在 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 中执行此操作的唯一方法吗?解决方案不必在 dplyr
或 tidyverse
.
中
我在 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)))
}
在 dplyr 中,如果 tbl
是数据库中的 table,则 head(tbl)
会被翻译成
select
*
from
tbl
limit 6
但似乎没有办法使用 offset
关键字来分块读取数据。例如。相当于
select
*
from
tbl
limit 6 offset 5
dplyr
似乎不可能。在dbplyr
里面有一个do
的功能可以让你选择一个chunk_size
来逐块的带回数据。
这是在 R 中执行此操作的唯一方法吗?解决方案不必在 dplyr
或 tidyverse
.
我在 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)))
}