2015-02-06 12 views
6

Tôi đang thực hiện một số phân tích về một lượng lớn dữ liệu được lưu trữ trong cơ sở dữ liệu PostgreSQL. Vì lý do tốc độ và bộ nhớ, tôi đang sử dụng gói data.table. Hiện tại tôi đang làm điều này để đọc dữ liệu.Có thể đọc dữ liệu.từ PostgreSQL không?

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

Tôi đang tự hỏi nếu có một cách tốt hơn để làm điều này mà không liên quan đến việc đọc toàn bộ điều vào một data.frame và sau đó sao chép nó vào một data.table.

+4

Có lẽ không phải là câu trả lời bạn đang tìm kiếm (?), Nhưng nếu bạn đã đọc nó dưới dạng 'data.frame', bạn có thể sử dụng' setDT() 'để chuyển nó thành' data.table' * theo tham chiếu * (chuyển đổi phải là ngay lập tức từ data.frame thành data.table) - tức là 'data <- dbGetQuery (...); setDT (dữ liệu) '. – Arun

+0

@Arun cảm ơn, đây có lẽ là những gì tôi sẽ làm, mặc dù tôi đã có thể muốn loại bỏ 'data.frame' từ phương trình hoàn toàn. – rmccloskey

Trả lời

1

Như Arun đã chỉ ra trong nhận xét bạn chỉ có thể sử dụng setDT trên kết quả dbGetQuery.

Ngoài ra, còn có chức năng trợ giúp có sẵn trong gói của tôi dwtools mở rộng tính năng này cho tự động setkey khi cần. Điều này được thiết kế hữu ích khi chuỗi. Nó cũng thống nhất giao diện với các nhà cung cấp cơ sở dữ liệu khác để bạn có thể chuỗi data.table bằng cách sử dụng các cơ sở dữ liệu khác nhau.
Các đơn giản chọn sử dụng sẽ trông giống như:

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

dụ nặng nề kéo dài từ gói thủ công:

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 
        ] 

Nó sẽ đọc dữ liệu từ nhiều cơ sở dữ liệu, tham gia, uẩn, lưu kết quả trung gian cho nhiều cơ sở dữ liệu.

Các vấn đề liên quan