2015-02-06 14 views
6

Sto facendo alcune analisi su un grande volume di dati memorizzati in un database PostgreSQL. Per motivi di velocità e memoria, sto utilizzando il pacchetto data.table. Attualmente sto facendo questo per leggere i dati.È possibile leggere un data.table da PostgreSQL?

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

Mi chiedo se c'è un modo migliore per fare questo che non coinvolge leggere il tutto in un data.frame e poi copiarlo in una data.table.

+4

Forse non è una risposta che stai cercando (?), Ma se lo hai già letto come 'data.frame', puoi usare' setDT() 'per convertirlo in' data.table' * per riferimento * (la conversione dovrebbe essere istantanea da data.frame a data.table) - cioè, 'data <- dbGetQuery (...); setDT (dati) '. – Arun

+0

@Arun grazie, probabilmente è quello che finirò a fare, anche se mi sarebbe piaciuto rimuovere 'data.frame's dall'equazione del tutto. – rmccloskey

risposta

1

Come indicato da Arun nel commento, è possibile utilizzare solo setDT sui risultati dbGetQuery.

Inoltre è disponibile una funzione di supporto nel pacchetto dwtools che estende questa funzionalità per l'auto setkey quando necessario. Questo è stato progettato per essere utile quando si concatena. Inoltre, unifica l'interfaccia con altri fornitori di database in modo da poter incatenare data.table utilizzando diversi database.
La semplice selezionare utilizzo volontà assomiglia:

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

esempio fortemente estesa da manuale pacchetto:

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 
        ] 

Sarebbe leggere i dati da più database, si unisce, aggregati, salvare i risultati intermedi a più database.

Problemi correlati