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
模式集要小得多。
数据
我处理一个大型数据集(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
- Returnstrue
ifstr
matchesregexp
, orfalse
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
模式集要小得多。