【问题标题】:How to use dbReadTable with PostgreSQL db with enormous size如何将 dbReadTable 与具有巨大大小的 PostgreSQL 数据库一起使用
【发布时间】:2017-09-30 14:20:02
【问题描述】:

有没有办法使用 dbReadTable 一次只读取几千行?
例如,我试图(出于必要)从一个 600 万行长的 Postgres 数据库中读入一个 d.table。当我尝试读取整个 d.table 时,RStudio 最终会冻结或永远不会完成。
例如,我可以指定读取第 1-100,000 行,然后是第 100,001-200,000 行,然后是第 200,001-300,000 行吗?
我熟悉指定要读取哪些列以加快流程,所以这不是我关心的事情。

【问题讨论】:

标签: r postgresql large-data database


【解决方案1】:

正如@r2evans 建议的那样,考虑使用迭代的dbGetQuery() 调用运行SQL,以读取每100,000 行对表进行切片的查询:

# VECTOR OF 60 SQL STATEMENTS TO QUERY 100,000 ROWS SKIPPING 100000 EACH TIME
sqls <-  paste0("SELECT col1, col2, col3, col4, col5 FROM mytable LIMIT 100000 OFFSET ", 
                seq(0, 5900000, by=100000))

# ROW BIND 60 DATASETS OF 100,000 ROWS
finaldf <- do.call(rbind, lapply(sqls, function(s) dbGetQuery(conn, s))

但是,我认为这个do.call 运行起来可能会非常缓慢和广泛。考虑使用第三方包(plyrdplyrdata.table)对从 PostGres 检索到的数据帧列表进行行绑定:

postgresdfs <- lapply(sqls, function(s) dbGetQuery(conn, s))

plyr::rbind.fill(postgresdfs)       

plyr::ldply(postgresdfs, data.frame)

dplyr::bind_rows(postgresdfs)

data.table::rbindlist(postgresdfs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多