使用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()
谢谢。
答案 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正则表达式,因此它可能无法涵盖某些极端情况。