如何处理SparkR中的空条目

时间:2015-07-23 21:46:38

标签: r apache-spark sparkr apache-spark-1.4

我有一个SparkSQL DataFrame。

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

在R中我可以很容易地删除它们但是在sparkR中它表示S4系统/方法存在问题。

感谢。

2 个答案:

答案 0 :(得分:12)

SparkR列提供long list of useful methods,其中包括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中NANaN之间没有区别。

如果您更喜欢对整个数据框进行操作,则会有一组NA functions,其中包括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

答案 1 :(得分:2)

这不是最好的解决方法,但如果将它们转换为字符串,它们将被存储为&#34; NaN&#34;然后你可以过滤它们,一个简短的例子:

o.add = function (display) {
    var defer = $q.defer();
    var config = { contentType: 'application/json' };
    $http.post('api/apiFood' + display, config).success(function (data) {
        defer.resolve(data);
    });
    return defer.promise;
};

这省略了b列中元素缺失的整行。