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

时间:2019-06-22 00:03:58

标签: r apache-spark sparklyr

使用sparklyr,我试图找到一种方法来过滤结合了rlike%in%功能的Spark数据帧。这是一个最小的工作示例:

# 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 

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

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

谢谢。

1 个答案:

答案 0 :(得分:2)

  

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

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

# 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

如果保证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)}" ), "|") )

wait

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