2015-02-06 45 views
6

Przeprowadzam analizę dużej ilości danych przechowywanych w bazie danych PostgreSQL. Ze względu na szybkość i pamięć używam pakietu data.table. Obecnie robię to, aby odczytać dane.Czy można odczytać plik data.table z PostgreSQL?

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

Zastanawiam się, czy istnieje lepszy sposób na to, że nie wymaga czytania całość do data.frame a następnie skopiowanie go do data.table zrobić.

+4

Być może nie jest to odpowiedź, której szukasz (?), Ale jeśli już ją odczytałeś jako 'data.frame', możesz użyć' setDT() 'aby przekonwertować ją na' data.table' * przez referencję * (konwersja powinna być natychmiastowa z data.frame do data.table) - tzn. 'data <- dbGetQuery (...); setDT (data) '. – Arun

+0

@Arun dziękuję, prawdopodobnie to właśnie skończę, chociaż chciałbym usunąć 'dane.frame's z równania. – rmccloskey

Odpowiedz

1

Jak zauważył Arun w komentarzu, można po prostu użyć setDT na dbGetQuery wyników.

Dodatkowo w moim pakiecie dwtools dostępna jest funkcja pomocnicza, która w razie potrzeby rozszerza tę funkcję o auto setkey. Zostało to zaprojektowane, by być użyteczne podczas łączenia. Ujednolica także interfejs dla innych dostawców baz danych, dzięki czemu można połączyć łańcuch danych przy użyciu różnych baz danych.
Prosta wybierz Wykorzystanie wola wygląda następująco:

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

Mocno dłuższy przykład z podręcznika pakiet:

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 
        ] 

Byłoby odczytać dane z wielu baz danych, łączy, kruszywa, zapisywać wyniki pośrednie do wielu baz danych.

Powiązane problemy