2015-07-23 12 views
6

Mam DataFrame SparkSQL.Jak obsługiwać puste pozycje w SparkR

Niektóre wpisy w tych danych są puste, ale nie zachowują się jak NULL lub NA. Jak mogę je usunąć? Jakieś pomysły?

W R mogę je łatwo usunąć, ale w iskrze R mówi się, że jest problem z systemem/metodami S4.

Dzięki.

Odpowiedz

10

SparkR Kolumna zapewnia long list of useful methods tym isNull i isNotNull:

> people_local <- data.frame(Id=1:4, Age=c(21, 18, 30, NA)) 
> people <- createDataFrame(sqlContext, people_local) 
> head(people) 

    Id Age 
1 1 21 
2 2 18 
3 3 NA 

> filter(people, isNotNull(people$Age)) %>% head() 
    Id Age 
1 1 21 
2 2 18 
3 3 30 

> filter(people, isNull(people$Age)) %>% head() 
    Id Age 
1 4 NA 

Proszę pamiętać, że nie ma różnicy między NA i NaN w SparkR.

Jeśli wolisz operacje na całej ramki danych jest zbiorem NA functions tym fillna i dropna:

> fillna(people, 99) %>% head() 
Id Age 
1 1 21 
2 2 18 
3 3 30 
4 4 99 

> dropna(people) %>% head() 
Id Age 
1 1 21 
2 2 18 
3 3 30 

Oba mogą być dostosowane do rozważenia tylko pewnego podzbioru kolumn (cols), a dropna ma jedne dodatkowe użyteczne parametry. Na przykład można określić minimalną liczbę NOT NULL kolumn:

> people_with_names_local <- data.frame(
    Id=1:4, Age=c(21, 18, 30, NA), Name=c("Alice", NA, "Bob", NA)) 
> people_with_names <- createDataFrame(sqlContext, people_with_names_local) 
> people_with_names %>% head() 
    Id Age Name 
1 1 21 Alice 
2 2 18 <NA> 
3 3 30 Bob 
4 4 NA <NA> 

> dropna(people_with_names, minNonNulls=2) %>% head() 
    Id Age Name 
1 1 21 Alice 
2 2 18 <NA> 
3 3 30 Bob 
2

To nie jest najpiękniejsze obejście, ale jeśli oddasz je jako ciągi, są one przechowywane jako „NaN”, a następnie można je filtrować, krótki przykład:

testFrame <- createDataFrame(sqlContext, data.frame(a=c(1,2,3),b=c(1,NA,3))) 
testFrame$c <- cast(testFrame$b,"string") 

resultFrame <- collect(filter(testFrame, testFrame$c!="NaN")) 
resultFrame$c <- NULL 

ten pomija cały wiersz gdzie brakuje elementu w kolumnie b.

+0

To wymagałoby odrębnego kodu dla różnych typów i będzie całkowicie niepowodzeniem z logicznych: 'df <- createDataFrame (SqlContext, data.frame (X = C (FAŁSZ , NA, TRUE))); df $ chx <- cast (df $ x, "string"); df%>% head() ' – zero323

+0

Problem polega na tym, że wpis jest pusty. Podam przykład: ID = 1 2 3. AGE = 21 EMPTY 20. Tak więc 2. w tych danych jest pusta, ale w sparkR nie ma "wartości" NAN, NA lub NULL. Chodzi o to, żeby ten pusty wpis był wartością? –

+0

Czy możesz podać przykład inicjalizacji? Aby zrozumieć, czy masz dane.frame (ID = c (1,2,3), AGE = c (21, "EMPTY", 20)) lub data.frame (ID = c (1,2,3), AGE = c (21,, 20)) lub jeszcze coś innego. –