基于多通配符的sparkyr-Spark-SQL过滤器

基于多通配符的sparkyr-Spark-SQL过滤器,r,apache-spark,sparklyr,R,Apache Spark,Sparklyr,使用SparkyR,我试图找到一种方法来过滤Spark数据帧,该数据帧结合了rlike和%in%功能。下面是一个简单的工作示例: # start a Spark session in R and have dplyr loaded # create a spark dataframe df <- data.frame(names = c("Brandon", "Chee", "Brandi", "Firouz", "Eric", "Erin"), pla

使用SparkyR,我试图找到一种方法来过滤Spark数据帧,该数据帧结合了
rlike
%in%
功能。下面是一个简单的工作示例:

# start a Spark session in R and have dplyr loaded

# create a spark dataframe
df <- data.frame(names = c("Brandon", "Chee", "Brandi", "Firouz", "Eric", "Erin"),
                 place = c("Pasadena", "South Bay", "West Hollywood", "SF Valley", "South Bay", "South Bay"))
sc_df <- sdf_copy_to(sc, df, overwrite = TRUE)

# set wildcard filter paramaters
f_params <- c("Brand", "Er")

# return all rows of sc_df where the 'names' value contains either 'f_params' values.
df_filtered <- sc_df %>% 
  filter(rlike(names, f_params)) %>% 
  collect()
附加规则:由于实际示例在
f_参数
中包含大约200个值,因此我无法使用以下解决方案:

df_filtered <- sc_df %>% 
  filter(rlike(names, "Brand") | rlike(names, "Er")) %>% 
  collect()
df_已过滤%
过滤器(rlike(名称,“品牌”)| rlike(名称,“Er”))%>%
收集
提前谢谢

我不能使用多个用|(OR)分隔的rlike()语句,因为实际示例中的f|u参数中包含大约200个值

这听起来像是一个相当人为的约束,但如果您真的想避免使用单个正则表达式,则始终可以编写一个显式析取:

library(rlang)

sc_df %>% 
  filter(!!rlang::parse_quo(glue::glue_collapse(glue::glue(
    "(names %rlike% '{f_params}')"), 
    " %or% "  # or " | "
  ), rlang::caller_env()))
#来源:spark[??x 2]
地名
1布兰登·帕萨迪纳
2布兰迪西好莱坞酒店
3埃里克南湾
南湾4号
如果保证
f_params
是有效的regexp文本,那么简单地连接字符串应该会快得多:

sc_df %>% 
  filter(names %rlike% glue::glue_collapse(glue::glue("{f_params}"), "|"))
#来源:spark[??x 2]
地名
1布兰登·帕萨迪纳
2布兰迪西好莱坞酒店
3埃里克南湾
南湾4号
如果没有,您可以尝试首先应用
Hmisc::escapeRegexp

sc_df %>% 
  filter(
    names %rlike% glue::glue_collapse(glue::glue(
      "{Hmisc::escapeRegex(f_params)}"
    ), "|")
  )
但请记住,Spark使用Java正则表达式,所以它可能不包括一些边缘情况

sc_df %>% 
  filter(
    names %rlike% glue::glue_collapse(glue::glue(
      "{Hmisc::escapeRegex(f_params)}"
    ), "|")
  )