我正在使用Databricks中的SparkR来操作大型 Dataframe 。我有一个spark DataFrame df
,我想从其中删除仅包含NA
值的所有列。在典型的R中,我会使用一种整齐的方法
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
的工作,它的效率很低。
如果你能想出更好的办法,请告诉我。我也愿意用python语言来完成这部分脚本,也可以使用pysppark。但是,由于我使用的是高并发集群,所以不能使用Scala代码。
非常提前感谢您。
1条答案
按热度按时间mklgxw1f1#
我已经能够使用以下代码删除仅包含NAS的列: