如何处理 SparkR 中的空条目
How to handle null entries in SparkR
我有一个 SparkSQL DataFrame。
此数据中的某些条目为空,但它们的行为不像 NULL 或 NA。我怎么能删除它们?有任何想法吗?
在 R 中,我可以轻松删除它们,但在 sparkR 中,它说 S4 system/methods 有问题。
谢谢。
这不是最好的解决方法,但如果您将它们转换为字符串,它们将存储为 "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 列中缺少元素的整行。
SparkR Column 提供了一个long list of useful methods包括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
请记住,在 SparkR 中 NA
和 NaN
之间没有区别。
如果您更喜欢对整个数据框进行操作,可以使用一组 NA functions,包括 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
我有一个 SparkSQL DataFrame。
此数据中的某些条目为空,但它们的行为不像 NULL 或 NA。我怎么能删除它们?有任何想法吗?
在 R 中,我可以轻松删除它们,但在 sparkR 中,它说 S4 system/methods 有问题。
谢谢。
这不是最好的解决方法,但如果您将它们转换为字符串,它们将存储为 "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 列中缺少元素的整行。
SparkR Column 提供了一个long list of useful methods包括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
请记住,在 SparkR 中 NA
和 NaN
之间没有区别。
如果您更喜欢对整个数据框进行操作,可以使用一组 NA functions,包括 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