我正在尝试使用SparkR数据帧上的向量按多个变量过滤一系列条件。
在常规数据帧上使用 tidyverse 执行此操作非常简单。例如:
library("tidyverse")
library("magrittr")
# filter vectors
filter_var1 <- c('111', '222')
filter_var2 <- c('a', 'c')
#create df
df <- data.frame(var1 = c("111", "222", "333", "333"), var2 = c("a", "a", "b", "c"))
df
# filter
df_filtered <- df %>% dplyr::filter( (var1 %in% filter_var1) | (var2 %in% filter_var2))
df_filtered
尝试对单变量过滤器做类似的事情有点乏味但可行(来自:sparkR示例1,sparkR示例2):
library(SparkR)
# Initialize a Spark session
sparkR.session(appName = "Create DataFrame Example")
# Create a data frame in SparkR
spark_df <- createDataFrame(data.frame(var1 = c("111", "222", "333", "333"), var2 = c("a", "a", "b", "c")))
# Show the data frame
showDF(spark_df)
spark_df_filtered <- spark_df %>% SparkR::filter(., (
paste("var1 in ('", paste(filter_var1, collapse = "','"), "')", sep = "")
))
但是在同一过滤器语句中使用 AND (
&&
) / OR (||
) 语句来添加更多条件时遇到困难。我确实找到了一个使用 sparkR::subset
here 的示例,但是当尝试使用向量来实现过滤时,我遇到了问题。
%in%
S4 方法来匹配列中的值。并使用 |
表示 OR,&
表示 AND 运算符。
require("magrittr")
require("SparkR")
# filter vectors
filter_var1 <- c('111', '222')
filter_var2 <- c('a', 'c')
# create Spark dataframe
spark_df <- SparkR::createDataFrame(data.frame(var1 = c("111", "222", "333", "333"),
var2 = c("a", "a", "b", "c")))
# filter Spark dataframe with multiple conditions
spark_df_filtered <- spark_df %>%
SparkR::filter((spark_df$var1 %in% filter_var1) |
(spark_df$var2 %in% filter_var2))
SparkR::head(spark_df_filtered)
#> var1 var2
#> 1 111 a
#> 2 222 a
#> 3 333 c