6

我在一个 12 节点的 redshift 集群中有 40 亿行数据。我成功地使用 Rpostgreqsql 包连接到它并使用 dplyr 进行基本的数据整理。

但是,我想做一些数据整形,我通常会使用 reshape2 (dcast) 或 tidyr (spread) 来做。我发现这两个包都没有在我的数据库对象上执行。我可以运行“收集”,但这会出现问题,因为该数据框太大而无法放入内存(因此我想在数据库中运行)。我的总体目标是使用 dcast/spread 使数据更宽,同时在过程中创建 0/1 标志。这就像我机器上的小数据样本的魅力,但在 DB 上不是很好。

下面是我正在工作的代码。连接到数据库并使用 dplyr 进行基本过滤。当我尝试使用 tidyr/reshape2 时,R 会抛出“类型无法识别”的语法错误

    Redshift <- src_postgres('dev',
                         host = 'xxx.aws.com',
                         port = 5439,
                         user = "user", 
                         password = "pwd")


### create table reference ###
df <- tbl(Redshift, "df_cj_allact")

# simple and default R commands analyzing data frames
dim(df)
colnames(df)
head(df)

df2 <- df %>% filter(id != '0') %>% arrange(id, timestamp, category)  # seems to work!
# 2157398, was 2306109 (6% loss)
4

1 回答 1

2

tidyr 包不支持数据库后端。您只能在内存数据中进行操作。dplyr 适用于数据库表以及内存对象。您可以尝试使用具有更大内存的机器(例如在 AWS 上)并使用 data.table,或者考虑拆分数据。

于 2016-02-17T10:02:23.790 回答