我在数据块中使用SparkR来操纵大型数据帧。我有一个spark DataFrame df
,我想从中删除仅包含NA
值的所有列。在典型的R中,我会使用tidyverse方法
df %>% select_if(~any(!is.na(.)))
或在基数R
中df[!sapply(df, function(x) all(is.na(x)))]
但是,这两种方法似乎都无法在SparkR中工作。我还想尽可能多地使用Spark的功能来分发工作。我找到了以下解决方案
nacols<- sapply(columns(df), function(c){
nbna <- SparkR::select(df, c) %>% SparkR::na.omit() %>% SparkR::nrow()
return(nbna != 0)
})
df_nona<- df %>% SparkR::select(columns(df)[c(T, nacols)])
但是我认为考虑到SparkR不分发sapply
的工作,效率很低。
请让我知道您是否可以想到一种更好的方法。我愿意使用pyspark在python中执行脚本的这一部分。但是,由于我使用的是高并发集群,因此无法使用Scala代码。
非常感谢您。