2016-02-10 4 views
6

12ノードの赤色シフトクラスタに40億行のデータがあります。私は正常にRpostgreqsqlパッケージでそれに接続することができ、dplyrを使って基本的なデータを争うことができます。postgreSQL(Redshift)データベースの "big"データにtidyr(またはそれに類似したデータ)を使用する方法

しかし、通常はreshape2(dcast)またはtidyr(spread)を使用してデータを再構成する必要があります。私はどちらのパッケージもデータベースオブジェクトで実行されないことを発見しています。私は "収集"を実行することができますが、データフレームが大きすぎてメモリに収まらないため(DB内で実行したいという理由で)問題があります。私の全体的な目標は、プロセスで0/1フラグを作成しながら、データを広げるためにdcast/spreadを使用することです。これは、私のマシン上のデータの小さなサンプルでは魅力的ですが、DB上ではあまりうまくいかないようです。

以下は私が働いているコードです。 DBに接続し、dplyrで基本的なフィルタリングを行います。私は/ reshape2をtidyr使用しようとすると、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) 

答えて

2

tidyrパッケージには、データベースのバックエンドをサポートしていません。あなたはメモリデータでしか操作できませんでした。 dplyrは、メモリー・オブジェクトと同様にデータベース表でも動作します。より大きいメモリを持つマシン(AWSなど)を使用してdata.tableを使用するか、データを分割することを検討してください。

+0

ご意見ありがとうございます。より大きいメモリ+ data.tableを持つマシンを使用することに関して...これはうまくいくかもしれません。私は、重いプロビジョニングされたAWS EC2インスタンスを持っています。 Data.tableとtidyrを使用する利点はありますか? – leaRningR909

+0

data.tableは非常に大きなオブジェクトのために設計されています。これは、data.tableオブジェクト用に最適化されたdcastとmelt関数を持ち、reshape2からdcast/meltと同じ働きをします。私はtidyr関数はより論理的だと思いますが、それは個人的な好みかもしれませんが、ネイティブのdata.tableオブジェクトで動作するかどうかはわかりません。代わりに最初にtbl_dfクラスに変換されるかもしれません。 – kismsu

+1

これに関連する[問題](https://github.com/tidyverse/tidyr/issues/189)があります。それは、「ちょっとした」人に当てはまるもののように思える。 –

関連する問題