2015-07-23 8 views
6

Ho un DataFrame SparkSQL.Come gestire voci nulle in SparkR

Alcune voci in questi dati sono vuote ma non si comportano come NULL o NA. Come posso rimuoverli? Qualche idea?

In R posso facilmente rimuoverli ma in sparkR si dice che c'è un problema con il sistema/metodi S4.

Grazie.

risposta

10

SparkR Colonna offre un long list of useful methods compresi isNull e 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 

Si prega di tenere presente che non v'è alcuna distinzione tra NA e NaN in SparkR.

Se preferite le operazioni su un intero frame di dati v'è un insieme di NA functions compresi fillna e 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 

Entrambi possono essere regolati a prendere in considerazione solo un sottoinsieme di colonne (cols), e dropna ha qualche ulteriori parametri utili. Per esempio è possibile specificare il numero minimo di colonne non nulle:

> 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

Non è la soluzione più bella, ma se li lanci come stringhe, che vengono memorizzate come "nan" e poi è possibile filtrare, un breve esempio:

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 

Questa omette l'intera riga in cui manca l'elemento nella colonna b

+0

Richiederebbe codice separato per i diversi tipi e fallirà completamente con booleani: 'df <- createDataFrame (SqlContext, data.frame (x = c (FALSE , NA, VERO))); df $ chx <- cast (df $ x, "stringa"); df%>% head() ' – zero323

+0

Bene, il problema è che la voce è vuota. Lasciatemi fare un esempio: ID = 1 2 3. AGE = 21 EMPTY 20. Quindi enry 2th in questo dato è vuoto ma in sparkR non ha il 'valore' NAN, NA o NULL. L'idea è forse quella di dare un valore a questa voce vuota? –

+0

Puoi dare un esempio di inizializzazione? Giusto per capire se hai data.frame (ID = c (1,2,3), AGE = c (21, "EMPTY", 20)) o data.frame (ID = c (1,2,3), AGE = c (21,, 20)) o ancora qualcos'altro. –