基于多通配符的sparkyr-Spark-SQL过滤器
使用SparkyR,我试图找到一种方法来过滤Spark数据帧,该数据帧结合了基于多通配符的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
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)}"
), "|")
)