基于多个通配符的Sparklyr Spark SQL筛选器

bshel​​t141

使用Sparklyr,我试图找到一种过滤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()

df_filtered在上面的代码中显然失败了。理想情况下,该df_filtered表将如下所示:

print(df_filtered)
# names     place           
# Brandon   Pasadena      
# Brandi    West Hollywood
# Eric      South Bay     
# Erin      South Bay 

附加规则:由于实际示例在中包含大约200个值f_params,因此我无法使用以下解决方案:

df_filtered <- sc_df %>% 
  filter(rlike(names, "Brand") | rlike(names, "Er")) %>% 
  collect()

提前致谢。

用户名

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

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

library(rlang)

sc_df %>% 
  filter(!!rlang::parse_quo(glue::glue_collapse(glue::glue(
    "(names %rlike% '{f_params}')"), 
    " %or% "  # or " | "
  ), rlang::caller_env()))
# Source: spark<?> [?? x 2]
  names   place         
  <chr>   <chr>         
1 Brandon Pasadena      
2 Brandi  West Hollywood
3 Eric    South Bay     
4 Erin    South Bay 

如果f_params保证是有效的regexp文字,那么简单地串联字符串应该更快:

sc_df %>% 
  filter(names %rlike% glue::glue_collapse(glue::glue("{f_params}"), "|"))
# Source: spark<?> [?? x 2]
  names   place         
  <chr>   <chr>         
1 Brandon Pasadena      
2 Brandi  West Hollywood
3 Eric    South Bay     
4 Erin    South Bay  

如果没有,您可以尝试先申请Hmisc::escapeRegexp

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

但请记住,Spark使用Java正则表达式,因此它可能无法涵盖某些极端情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章