首页 > 解决方案 > 使用 Sparklyr 计数模式匹配

问题描述

我一直在尝试使用 Sparklyr 计算模式匹配。

我正在尝试计算模式“;”的次数 出现在变量 room_number 中

这是 mytable :

room_number      
A12;A19        
A13            
A15;A14;A20 

当我不使用 Sparklyr 时,我可以使用此功能:

count.matches <- function(pat, vec) sapply(regmatches(vec, gregexpr(pat, vec)), length)

mytable <- mytable %>%
mutate(number_pattern = mapply(count.matches, c(';'), list(room_number)))

我得到:

room_number    number_pattern    
A12;A19        1
A13            0
A15;A14;A20    2

如果我尝试使用 sparklyr 在分布式 R 中应用代码,spark_apply而不是mapply,我会收到以下消息:

mytable  <- mytable  %>%
+   mutate(number_pattern = spark_apply(count.matches, c(';'), list(room_number)))
glimpse(mytable)

UseMethod(“escape”)中的错误:没有适用于“escape”的方法应用于“function”类的对象

你有什么建议吗 ?谢谢你的协助

标签: rapache-sparksparklyr

解决方案


spark_apply是一个独立的函数,不能在mutate. 此外,它没有与以下相同的 API mapply

count.matches <- function(pat) function(df) {
  f <- function(vec) sapply(regmatches(vec, gregexpr(pat, vec)), length)
  dplyr::mutate(df, number_pattern = f(room_number))
}

mytable %>% spark_apply(count.matches(";"))

推荐阅读