使用spark_apply计算缺失值的数量

时间:2017-07-20 16:44:20

标签: apache-spark dplyr apply na missing-data

我有下一个名为 df

的数据框
ci ing de
21 20 100
22 19 0
23 NA 80
24 100 NA
25 NA 50
26 50 30

我希望使用 spark 计算每列的缺失次数。

我知道在R中这样的代码可以正常工作

apply(df, 2, 
            FUN = function (x) 
            { sum(is.na(x)) }  ) 

我想做同样的事情,但使用 spark

Saprk有一个名为 spark_apply 的功能,但我无法弄清楚如何让它工作

4 个答案:

答案 0 :(得分:0)

这里“na”检查df ......

scala> nacount=df.na.count()
scala>nacount
2000

答案 1 :(得分:0)

spark_apply(   DF,   (函数(e)总和(is.na(e)),   names = c(“你的”,“列”,“名字”) )

试试上面的

答案 2 :(得分:0)

不完美但使用spark_apply可以达到您的目的:

## count missing values by each column and group by category 
ci = c(21:26)
ing = c(20,19,NA,100,NA,50)
de = c(100,0,80,NA,50,30)
df = as.data.frame(list(ci=ci, ing=ing, de=de))
sdf = copy_to(sc, df)
count_na_col_i = function(i, sdf) {
  cns = colnames(sdf)
  cnt = spark_apply(sdf %>% select(cns[1], cns[i]) %>% mutate(x = cns[i]) %>% rename(y = cns[i]), #preparing data for spark_apply and renames as necessary
            f = function(tbl){
              require(dplyr)
              cn = as.character(collect(tbl %>% select("x") %>% distinct()))
              tbl %>% filter(is.na(y)) %>% count()
            }, columns = cns[i], group_by = cns[1])
  collect(cnt)
}
#i-th column only
i = 2
nna = count_na_col_i(2, sdf)
#all columns 
lapply(seq(2,length(colnames(sdf))), function(i, sdf) { count_na_col_i(i, sdf) }, sdf)

答案 3 :(得分:0)

使用@Charlie的sdf对象:

sdf %>% spark_apply(function(e) apply(e, 2, function(x) sum(is.na(x))))

将完成这项工作。

结果是一个带有一个col的df,其中包含一行NA中每列sdf的个数。如果需要,您可以转置它(... %>% as.data.frame() %>% t())并手动添加组合名称。

# Source:   table<sparklyr_tmp_3f7f4665748e> [?? x 1]
# Database: spark_connection
     ci
  <int>
1     0
2     2
3     1