Apache spark 使用spark_apply计算缺失值的数量

Apache spark 使用spark_apply计算缺失值的数量,apache-spark,dplyr,apply,na,missing-data,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 Spark有一个名为“Spark\u apply”的函数,但我不知道

我的下一个数据帧名为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

Spark有一个名为“Spark\u apply”的函数,但我不知道如何使它工作。

这里是“na”在df中检查

scala> nacount=df.na.count()
scala>nacount
2000
这里是“na”正在签入df

scala> nacount=df.na.count()
scala>nacount
2000
火花点火器( df, (函数(e)和(is.na(e)), name=c(“您的”、“列”、“名称”) )

请尝试上述方法( df, (函数(e)和(is.na(e)), name=c(“您的”、“列”、“名称”) )


尝试上面的方法不完美,但使用spark\u 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)

不完美,但使用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)

使用@Charlie的
sdf
对象:

sdf %>% spark_apply(function(e) apply(e, 2, function(x) sum(is.na(x))))
我会做好的

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

# Source:   table<sparklyr_tmp_3f7f4665748e> [?? x 1]
# Database: spark_connection
     ci
  <int>
1     0
2     2
3     1
#来源:表[??x 1]
#数据库:spark_连接
词
1     0
2     2
3     1

使用@Charlie的
sdf
对象:

sdf %>% spark_apply(function(e) apply(e, 2, function(x) sum(is.na(x))))
我会做好的

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

# Source:   table<sparklyr_tmp_3f7f4665748e> [?? x 1]
# Database: spark_connection
     ci
  <int>
1     0
2     2
3     1
#来源:表[??x 1]
#数据库:spark_连接
词
1     0
2     2
3     1

我将澄清“缺失”的含义。如果您正在推断如何在Spark中计算空值,这里有一篇关于使用空值的好文章。抱歉,但我不理解我将澄清“缺失”的含义。如果您正在推断如何在Spark中计算空值,这里有一篇关于使用空值的好文章。抱歉,我不知道t了解类字符返回0,类数值-->返回所有NA的总和(所有列)不是预期的结果。了解类字符返回0,类数值-->返回所有NA的总和(所有列)不是预期的结果