2016-02-10 19 views
6

Mam 4 miliardy wierszy danych w 12-węzłowym klastrze redshift. Z powodzeniem mogę połączyć się z nim za pomocą pakietu Rpostgreqsql i użyć dplyr do wykonywania podstawowych danych.Jak korzystać z tidyr (lub podobnych danych) na "dużych" danych w bazie danych PostgreSQL (Redshift)

Chciałbym jednak zmienić niektóre dane, które normalnie użyłbym w wersji reshape2 (dcast) lub tidyr (spread). Zauważyłem, że żaden pakiet nie jest wykonywany na moim obiekcie bazy danych. Mógłbym uruchomić "zbieranie", ale byłoby to problematyczne, ponieważ ta ramka danych byłaby zbyt duża, aby zmieścić się w pamięci (stąd powód, dla którego chcę działać w DB). Moim ogólnym celem jest wykorzystanie dcast/spread do poszerzenia danych przy jednoczesnym tworzeniu flag 0/1. Działa to jak urok z małymi próbkami danych na moim komputerze, ale nie tak dobrze na DB.

Poniżej znajduje się mój kod, nad którym pracuję. Łączenie z bazą danych i wykonywanie podstawowych filtrów za pomocą programu dplyr. Kiedy próbuję użyć tidyr/reshape2, R wyrzuca błędy składniowe, że „nie rozpoznał typu”

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) 

Odpowiedz

2

pakiet tidyr nie obsługuje systemu bazodanowego. Można manipulować tylko danymi w pamięci. dplyr pracuje z tabelami bazy danych, a także z obiektami pamięci. Możesz spróbować użyć maszyny z większą pamięcią (np. Na AWS) i korzystać z data.table lub pomyśleć o dzieleniu danych.

+0

Dzięki za komentarz. Jeśli chodzi o korzystanie z komputera z większą pamięcią + data.table ... to może działać. Mam instancję AWS EC2, która ma dużą pamięć pamięci. Czy istnieje korzyść z używania data.table z tym kontra tidyr? – leaRningR909

+0

data.table przeznaczone dla bardzo dużych obiektów 10s milionów wierszy. Posiada funkcje dcastu i stopu zoptymalizowane dla obiektów data.table, a tam działa tak samo jak dcast/melt z reshape2. Myślę, że funkcje tidyr są bardziej logiczne, ale może to być osobiste preferencje, jednak nie jestem pewien, czy działa z natywnymi obiektami data.table, zamiast tego może najpierw przekonwertować do klasy tbl_df. – kismsu

+1

Istnieje [wydanie] (https://github.com/tidyverse/tidyr/issues/189) związane z tym. Wydaje się, że w "tidyr" byłoby to czymś naturalnym. –

Powiązane problemy