Как обрабатывать нулевые записи в 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.

Другие вопросы по тегам