2016-02-10 3 views
6

Ich habe 4 Milliarden Zeilen von Daten in einem 12-Knoten-Rotverschiebung-Cluster. Ich bin erfolgreich in der Lage, mit ihm mit dem Rpostgreqsql Paket in Verbindung zu treten und dplyr zu verwenden, um grundlegendes Datenkonflikt zu tun.Wie tidyr (oder ähnliche Datenschlingen) auf "großen" Daten in PostgreSQL (Redshift) Datenbank

Ich würde jedoch gerne einige Daten Umformungen machen, die ich normalerweise reforme2 (dcast) oder tidyr (spread) tun würde. Ich finde, dass kein Paket auf meinem Datenbankobjekt ausgeführt wird. Ich könnte "collect" ausführen, aber das wäre problematisch, weil dieser Datenrahmen viel zu groß wäre, um in den Speicher zu passen (daher der Grund, warum ich in DB laufen möchte). Mein übergeordnetes Ziel ist es, mit dcast/spread die Daten zu erweitern und dabei 0/1 Flags zu erstellen. Dies funktioniert wie ein Zauber mit kleinen Datenproben auf meiner Maschine, aber nicht so gut auf DB.

Unten ist mein Code, den ich habe. Verbinden mit DB und grundlegende Filterung mit dplyr. Wenn ich versuche/reshape2 zu verwenden tidyr, wirft R-Syntaxfehler, dass nicht unterstützt Datenbank-Backend „Typ nicht erkannt“

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) 

Antwort

2

tidyr Paket. Sie konnten nur im Speicher Daten manipulieren. dplyr arbeitet sowohl mit Datenbanktabellen als auch mit In-Memory-Objekten. Sie können entweder versuchen, einen Computer mit größerem Speicher (z. B. bei AWS) zu verwenden und data.table zu verwenden oder über das Teilen Ihrer Daten nachzudenken.

+0

Danke für Ihren Kommentar. In Bezug auf die Verwendung einer Maschine mit größerem Speicher + Daten.Tabelle ... könnte dies funktionieren. Ich habe eine AWS EC2-Instanz, die speicherintensiv ist. Gibt es einen Vorteil bei der Verwendung von data.table mit dem vs. tidyr? – leaRningR909

+0

data.table entworfen für sehr große Objekte 10s Millionen von Zeilen. Es hat dcast und schmelzen Funktionen optimiert für data.table Objekte, und dort funktionieren die gleichen wie dcast/melt von reshape2. Ich denke, tidyr-Funktionen sind logischer, aber es könnte persönliche Präferenz sein, aber ich bin mir nicht sicher, dass es mit nativen data.table-Objekten funktioniert, stattdessen kann es zuerst in tbl_df-Klasse konvertieren. – kismsu

+1

Es gibt ein [Problem] (https://github.com/tidyverse/tidyr/issues/189) in Verbindung damit. Es scheint etwas zu sein, das in 'tidyr' natürlich wäre. –

Verwandte Themen