如何使用SparkR计算数据框每列的缺失值数量?

时间:2016-11-15 20:25:43

标签: sparkr

我正在处理一个2.5 GB的csv文件,其中包含1,100万行和1000个数字列,这些列似乎是稀疏填充的。我目前在具有8 GB RAM的单核VM上执行Spark,并且数据已分成16个分区。

我尝试了类似下面的内容,但需要很长时间:

ldf <- dapplyCollect(
     df,
     function(df.partition) {
       apply(df.partition, 2, function(col) {sum(is.na(col))})
     })

1 个答案:

答案 0 :(得分:3)

使用sparklyrdplyr,这是一种方法。为了一个可重复的例子,我使用的是来自nycflights13包裹的航班数据(336个,其中包括19个变量)

library(nycflights13)
library(sparklyr)
library(dplyr)
sc <- sparklyr::spark_connect(master = "local", version = "2.1.0", hadoop_version = "2.7")

    flights_spark <- sparklyr::copy_to(sc, flights)
    src_tbls(sc)

  flights_spark %>% 
    dplyr::mutate_all(is.na) %>%
    dplyr::mutate_all(as.numeric) %>%
    dplyr::summarise_all(sum) %>%
    dplyr::collect()

你得到了结果

> collect(flights_spark_isna_count)
# A tibble: 1 × 19
   year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin  dest air_time
  <dbl> <dbl> <dbl>    <dbl>          <dbl>     <dbl>    <dbl>          <dbl>     <dbl>   <dbl>  <dbl>   <dbl>  <dbl> <dbl>    <dbl>
1     0     0     0     8255              0      8255     8713              0      9430       0      0    2512      0     0     9430
# ... with 4 more variables: distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dbl>

在我的旧笔记本电脑中,所有这些代码花了大约30秒(即包括启动Spark会话,将数据读入Spark然后计算NA;我认为这最后一步花了不到10秒)。

当然,您的数据集较大,但可能有效。 (我在我正在研究的更大的数据集数据中也尝试过它,因此大约有200万个障碍物和146个变量,只需要几分钟)。