2016-02-10 8 views
6

Ho 4 miliardi di righe di dati in un cluster redshift a 12 nodi. Con successo riesco a collegarmi con il pacchetto Rpostgreqsql e usare dplyr per fare il bombardamento dei dati di base.Come utilizzare tidyr (o simile wrangling di dati) su dati "grandi" nel database postgreSQL (Redshift)

Tuttavia, mi piacerebbe fare un rimodellamento dei dati che normalmente utilizzerei reshape2 (dcast) o tidyr (spread) da fare. Sto trovando che nessun pacchetto viene eseguito sul mio oggetto di database. Potrei eseguire "collect", ma sarebbe problematico perché quel dataframe sarebbe troppo grande per essere inserito nella memoria (da qui il motivo per cui voglio eseguire in DB). Il mio obiettivo generale è usare dcast/spread per ampliare i dati durante la creazione di flag 0/1 nel processo. Funziona come un incantesimo con piccoli campioni di dati sulla mia macchina, ma non così bene su DB.

Di seguito è riportato il mio codice che ho funzionato. Connessione a DB e creazione di filtri di base con dplyr. Quando provo ad usare tidyr/reshape2, R getta errori di sintassi che "non si digita riconosciuto"

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) 

risposta

2

pacchetto tidyr non supporta database backend. È possibile manipolare solo nei dati di memoria. dplyr funziona con tabelle di database e con oggetti di memoria. Potresti provare a utilizzare la macchina con una memoria più grande (ad esempio su AWS) e utilizzare data.table o pensare a suddividere i dati.

+0

Grazie per il tuo commento. Per quanto riguarda l'utilizzo della macchina con memoria più grande + data.table ... questo potrebbe funzionare. Ho un'istanza AWS EC2 che è dotata di memoria pesante. C'è un vantaggio nell'usare data.table con quello contro tidyr? – leaRningR909

+0

data.table progettato per oggetti molto grandi 10 milioni di righe. Ha funzioni dcast e melt ottimizzate per oggetti data.table, e funzionano come dcast/melt da reshape2. Penso che le funzioni di tidyr siano più logiche, ma potrebbe essere una preferenza personale, tuttavia, non sono sicuro che funzioni con gli oggetti nativi data.table, ma potrebbe prima convertirsi in classe tbl_df. – kismsu

+1

C'è un [problema] (https://github.com/tidyverse/tidyr/issues/189) relativo a questo. Sembra qualcosa che sarebbe naturale avere in 'tidyr'. –

Problemi correlati