SparkR regexp_extract 函数的问题

Issue with SparkR regexp_extract function

数据

我处理一个大型数据集(2.8 亿行),Spark 和 R 似乎可以很好地处理它。

问题

我在使用 SparkR 的 regexp_extract 函数时遇到了问题。我认为它与 Stringr 的 str_detect 类似地工作,但我还没有设法让它工作。 regexp_extract 的文档是有限的。你能帮我一下吗?

Reprex

这是一个代表,我试图在其中识别没有 space 的字符串并将“00:01”粘贴为后缀。

# Load packages
library(tidyverse)
library(sparklyr)
library(SparkR)

# Create data
df <- data.frame(sampletaken = c("06/03/2013", "29/11/2005 8:30", "06/03/2013", "15/01/2007 12:25", "06/03/2013", "15/01/2007 12:25"))

# Create Spark connection
sc <- spark_connect(master = "local", spark_home = spark_home_dir())

# Transfer data to Spark memory
df <- copy_to(sc, df, "df", overwrite = TRUE)

# Modify data
df1 <- df %>%
  dplyr::mutate(sampletaken = ifelse(regexp_extract(sampletaken, " "), sampletaken, paste(sampletaken, "00:01")))

# Collect data as dataframe
df1 <- df1 %>% as.data.frame()
head(df1$sampletaken)

错误

错误:org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解析 '(NOT regexp_extract(df.sampletaken, ' ', 1))':参数 1 需要布尔类型, 但是, 'regexp_extract(df.sampletaken, ' ', 1)' 是字符串类型.;第 1 行位置 80;

解决方案

# Load packages
library(tidyverse)
library(sparklyr)
library(SparkR)

# Create data
df <- data.frame(sampletaken = c("06/03/2013", "29/11/2005 8:30", "06/03/2013", "15/01/2007 12:25", "06/03/2013", "15/01/2007 12:25"))

# Create Spark connection
sc <- spark_connect(master = "local", spark_home = spark_home_dir())

# Transfer data to Spark memory
df <- copy_to(sc, df, "df", overwrite = TRUE)

# Modify data
df1 <- df %>%
  dplyr::mutate(sampletaken1 = ifelse(rlike(sampletaken, " "), sampletaken, paste(sampletaken, "00:01")))

# Collect data as dataframe
df1 <- df1 %>% as.data.frame()
head(df1$sampletaken)

我对 SparkR 不熟悉,但函数 regex_extract returns 似乎是一个字符串(大概是字符串中匹配的模式)而不是函数所要求的布尔值ifelse.

您可以尝试将返回值与空字符串进行匹配。

如果您正在寻找 str_detect 的类似物,可能 rlike 就是您所追求的,请参阅 SQL API docs:

str rlike regexp - Returns true if str matches regexp, or false otherwise.

SELECT '%SystemDrive%\Users\John' rlike '%SystemDrive%\Users.*'
true

Column 上(即在 R 中,而不是通过 sql() 在 SparkQL 中),它会像:

rlike(Column, 'regex.*pattern')

# i.e., in magrittr form
Column %>% rlike('regex.*pattern')

请注意,如果可以使用 like 通常效率更高,因为有效的 like 模式集要小得多。