8

我有一个 SparkSQL 数据框。

此数据中的某些条目是空的,但它们的行为不像 NULL 或 NA。我怎样才能删除它们?有任何想法吗?

在 RI 中可以轻松删除它们,但在 sparkR 中它说 S4 系统/方法存在问题。

谢谢。

4

2 回答 2

13

SparkR Column 提供了一长串有用的方法,包括isNullisNotNull

> 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

请记住,SparkR 中的NA和之间没有区别。NaN

如果您更喜欢对整个数据框进行操作,则有一组NA 函数,包括fillnadropna

> 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
于 2015-07-25T13:44:36.287 回答
2

这不是最好的解决方法,但如果您将它们转换为字符串,它们将存储为“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 列中缺少元素的整行。

于 2015-07-24T06:13:51.817 回答