我正在处理一个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))})
})
答案 0 :(得分:3)
使用sparklyr
和dplyr
,这是一种方法。为了一个可重复的例子,我使用的是来自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个变量,只需要几分钟)。