如何使用 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<-data.frame(thisdata)
【参考方案2】:
对于仍在使用 dplyr 0.5 的人(比如我)。
参数n
是collect
函数的一部分。
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 表