Альтернатива ``stringr::str_detect`` при работе в Spark

Я работал в RStudio на локальном устройстве пару лет и недавно начал работать со Spark (версия 3.0.1). Я столкнулся с неожиданной проблемой при попытке запустить stringr::str_detect() в Spark. По-видимому, str_detect() не имеет эквивалента в SQL. Ищу альтернативу, желательно в R.

Вот пример моего ожидаемого результата при локальном запуске str_detect() по сравнению со Spark.

# Load packages
library(dplyr)
library(stringr)
library(sparklyr)

# Example tibble
df <- tibble(foodtype = c("potatosalad", "potato", "salad"))
df

---
# A tibble: 3 x 1
  foodtype   
  <chr>      
1 potatosalad
2 potato     
3 salad 
---

# Expected result when using R
df %>% 
  mutate(contains_potato = str_detect(foodtype, "potato"))

---
# A tibble: 3 x 2
  foodtype    contains_potato
  <chr>       <lgl>          
1 potatosalad TRUE           
2 potato      TRUE           
3 salad       FALSE  
---

Но когда я запускаю этот код в кадре данных Spark, он возвращает следующее сообщение об ошибке: Ошибка: str_detect() недоступен в этом варианте SQL.

# Connect to local Spark cluster
sc <- spark_connect(master = "local", version = "3.0")

# Copy tibble to Spark cluster
df_spark <- copy_to(sc, df)
df_spark

# Error when using str_detect with Spark
df_spark %>% 
  mutate(contains_potato = str_detect(foodtype, "potato"))

---
Error: str_detect() is not available in this SQL variant
---

person Adriaan Nering Bögel    schedule 02.02.2021    source источник


Ответы (1)


str_detect() эквивалентна функции Spark rlike. Я не использую искру с R, но что-то вроде этого должно работать:

df_spark %>% mutate(contains_potato = foodtype %rlike% "potato")

dplyr принимает функции Spark, написанные как функции R, когда нет эквивалента dplyr:

df_spark %>% mutate(contains_potato = rlike(foodtype, "potato"))

person blackbishop    schedule 02.02.2021
comment
Спасибо @blackbishop! Я несколько отредактировал ваш ответ, чтобы он содержал R как письменный код (без каламбура). - person Adriaan Nering Bögel; 02.02.2021