Как обрабатывать нулевые записи в SparkR
У меня есть SparkSQL DataFrame.
Некоторые записи в этих данных пусты, но они не ведут себя как NULL или NA. Как я мог удалить их? Есть идеи?
В R I их легко удалить, но в sparkR говорится, что есть проблема с системой / методами S4.
Благодарю.
2 ответа
SparkR Column предоставляет длинный список полезных методов, включая isNull
а также 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
Пожалуйста, имейте в виду, что нет различий между NA
а также NaN
в SparkR.
Если вы предпочитаете операции с целым фреймом данных, есть набор функций NA, включая fillna
а также 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
Оба могут быть скорректированы, чтобы рассмотреть только некоторое подмножество столбцов (cols
), а также dropna
имеет некоторые дополнительные полезные параметры. Например, вы можете указать минимальное количество ненулевых столбцов:
> 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
Это не самый лучший обходной путь, но если вы приведете их в виде строк, они будут сохранены как "NaN", а затем вы можете отфильтровать их, краткий пример:
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
Это пропускает всю строку, где отсутствует элемент в столбце b.