2015-02-06 6 views
6

Ich mache eine Analyse auf einer großen Menge von Daten in einer PostgreSQL-Datenbank gespeichert. Aus Gründen der Geschwindigkeit und des Speichers verwende ich das data.table Paket. Momentan mache ich das um die Daten zu lesen.Ist es möglich, eine data.table von PostgreSQL zu lesen?

library(RPostgreSQL) 
library(data.table) 
... 
query <- "SELECT * FROM eqtl" 
data <- as.data.table(dbGetQuery(con, query)) 

Ich frage mich, ob es einen besseren Weg, dies zu tun, das beinhaltet nicht die ganze Sache in einen data.frame Lesen und Kopieren sie dann in eine data.table.

+4

Vielleicht keine Antwort, die Sie suchen (?), Aber wenn Sie es bereits als 'dat.frame' gelesen haben, können Sie' setDT() 'verwenden, um es in' data.table' zu ​​konvertieren * durch Referenz * (die Konvertierung sollte sofort von data.frame nach data.table erfolgen) - dh 'data <- dbGetQuery (...); setDT (Daten) '. – Arun

+0

@Arun danke, das ist wahrscheinlich, was ich am Ende tun werde, obwohl ich 'data.frame's aus der Gleichung insgesamt entfernen wollte. – rmccloskey

Antwort

1

Wie Arun im Kommentar darauf hingewiesen, können Sie einfach setDT auf dbGetQuery Ergebnisse verwenden.

Zusätzlich gibt es eine Hilfsfunktion in meinem Paket dwtools, die diese Funktion für Auto setkey bei Bedarf erweitert. Dies wurde entwickelt, um beim Verketten nützlich zu sein. Es vereinheitlicht auch die Schnittstelle zu anderen Datenbankanbietern, so dass Sie data.table mit verschiedenen Datenbanken verketten können.
Die einfache select Nutzung wird wie folgt aussieht:

my_dt = db("SELECT * FROM eqtl") 
# to setkey use 
db("SELECT * FROM eqtl", key="mykeycol") 

Stark erweitertes Beispiel aus dem Paket manuell:

jj_aggr = quote(list(amount=sum(amount), value=sum(value))) 
r <- db("sales",key="geog_code" # read fact table from db 
     )[,eval(jj_aggr),keyby=c("geog_code","time_code") # aggr by geog_code and time_code 
      ][,db(.SD) # write to db, auto.table.name 
      ][,db("geography",key="geog_code" # read lookup geography dim from db 
       )[.SD # left join geography 
        ][,eval(jj_aggr), keyby=c("time_code","geog_region_name")] # aggr 
       ][,db(.SD) # write to db, auto.table.name 
       ][,db("time",key="time_code" # read lookup time dim from db 
        )[.SD # left join time 
         ][, eval(jj_aggr), keyby=c("geog_region_name","time_month_code","time_month_name")] # aggr 
        ][,db(.SD) # write to db, auto.table.name 
        ] 

Es wäre von Daten aus mehreren Datenbanken lesen, schließt sich, Aggregate, Zwischenergebnisse zu mehreren Datenbanken speichern.

Verwandte Themen