如何使用 R 和 dplyr 从 Redshift 检索超过 100000 行

Posted

技术标签:

【中文标题】如何使用 R 和 dplyr 从 Redshift 检索超过 100000 行【英文标题】:How to retrieve more than 100000 rows from Redshift using R and dplyr 【发布时间】:2015-07-17 23:28:26 【问题描述】:

我正在分析来自 Redshift 数据库的数据,使用每个 dplyr 的连接在 R 中工作 - 有效:

my_db<-src_postgres(host='my-cluster-blahblah.redshift.amazonaws.com', port='5439', dbname='dev',user='me', password='mypw')
mytable <- tbl(my_db, "mytable")

viewstation<-mytable %>%
    filter(stationname=="something") 

当我尝试将该输出转换为数据框时,因此:

thisdata<-data.frame(viewstation)

我收到错误消息, 警告信息:

Only first 100,000 results retrieved. Use n = -1 to retrieve all. 

我应该在哪里设置 n?

【问题讨论】:

注意,我确实希望将子集划分为少于 100000 个点,但我不能这样做:thisdata 更好的做法是使用 SELECT 查询中的 WHERE 子句对 Redshift 执行子集。它将防止通过网络进行不必要的数据传输并填满您机器的内存。 但我想要所有这些数据 :) 我想要所有这些数十万点。随机选择以减少数字只是一个好的次佳。如果可能的话,我宁愿呆在 dplyr 中——对于它工作的用例来说非常容易...... 我知道您可以直接在从 rpostgresql 管理的查询中设置 n - 它是“获取”命令的参数。但是我怎样才能从 dplyr 得到呢? 【参考方案1】:

而不是使用

thisdata<-data.frame(viewstation)

使用

thisdata <- collect(viewstation)

collect() 会将数据库中的所有数据拉回 R。正如 DPLYR::databases 小插图中所述:

在使用数据库时,dplyr 会尽可能地懒惰。它在两个方面很懒:

除非您明确要求,否则它永远不会将数据拉回 R。

它将任何工作延迟到最后一分钟,收集您想做的所有事情,然后一步将其发送到数据库。

【讨论】:

ooo @phiver 我认为它有效。其次是thisdata_df&lt;-data.frame(thisdata)【参考方案2】:

对于仍在使用 dplyr 0.5 的人(比如我)。

参数ncollect 函数的一部分。

my_db<-src_postgres(host='my-cluster-blahblah.redshift.amazonaws.com', port='5439', dbname='dev',user='me', password='mypw')
mytable <- tbl(my_db, "mytable") %>% collect(n = Inf)

这将使您超过 100.000 行

【讨论】:

以上是关于如何使用 R 和 dplyr 从 Redshift 检索超过 100000 行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dplyr 和 RPostgreSQL 将 r 连接到 redshift?

使用 RPostgreSQL 和 dplyr 将 R 连接到 Redshift 的理论是啥

R 在使用 dplyr 或 RPostgreSQL 的模式下访问 redshift 表

在 Redshift dplyr 操作中重命名汇总列

如何在 R 中使用 dplyr mutate 函数来计算运行余额?

将代码从基数R转换为dplyr,特别是添加变量