使用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] 删除。
我来说两句