regex 在SQL中替换R的grepl的函数

brgchamk  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(62)

一点背景:我正在使用一个impala数据库,目前正在查询一个具有特定列(我称之为body)的大型表,该列中基本上包含文本段落。由于这个查询的性质,我需要在body列中嵌入一个文本挖掘器(使用regex),如果找到了什么,它将给予某些指示符。使用R,我可以用一个grepl或stringi包的一个简单的stri_detect_regex函数很好地做到这一点,需要注意的是,它迫使我提前收集我的表,因为这些子字符串检测函数不能直接翻译成sql。
我正在寻找的是R的grepl的替换函数,它将吐出真/假指示符来与我下面的代码一起工作(* 它做了我需要的 *),这样我就可以保持查询不被收集以优化运行时间:

DF_2 <- DF_1 %>% 
  collect() %>%
  mutate(body = tolower(body),
         indicator= ifelse(stri_detect_regex(body,"REGEX1"),"Y",
                        ifelse(stri_detect_regex(body,'REGEX2'),"ANALYSIS",
                               ifelse(stri_detect_regex(body,"REGEX3"),"RECOMMENDED","NULL")))) %>% select(...)

字符串
下面是一个DF示例,只是为了获得一些上下文:

DF1

body
text1
text2
text3

理想输出:
| 指示器| indicator |
| --| ------------ |
| Y轴| Y |
| 空的| NULL |
| 分析方法| ANALYSIS |
这只是一个非常简单的嵌套ifelse语句,它开始检查第一个正则表达式匹配,如果是,则打印Y,如果不是,则检查第二个正则表达式匹配,依此类推……
以下是我尝试的改编(并没有达到我想要的效果):

DF_2 <- DF_1 %>%
  mutate(body = tolower(body),
         indicator= ifelse(sql("body RLIKE 'REGEX1'"),"Y",
                                     ifelse(sql("body RLIKE 'REGEX2'"),"ANALYSIS",
                                            ifelse(sql("body RLIKE 'REGEX3'"),"RECOMMENDED","NULL")))) %>% select(...)


出于某种原因,输出列(指示符)是一个变量类型为boolean的列,这让我相信我试图用来替换grepl的函数并没有完成与grepl函数相同的任务。是否有一个修复这个或可能是一个更合适的函数来使用,将完成我需要什么?

wlp8pajw

wlp8pajw1#

通过@Gregor托马斯的评论,我能够修改我的代码,基本上做我需要的事情:

DF2 <- DF1 %>%
  mutate(body = tolower(body),
         indicator = case_when(sql("lower(body) RLIKE 'regex1'") ~ "NULL",
                                        sql("lower(body) RLIKE 'regex2'") ~ "Y",
                                        sql("lower(body) RLIKE 'regex3'") ~ "ANALYSIS",
                                        sql("lower(body) RLIKE 'regex4'") ~ "RECOMMENDED",
                                        TRUE ~ "NULL")) %>% select(...)

字符串
由于某种原因,它没有处理我对body列所做的第一个mutate,所以我在执行RLIKE时不得不重复它,但这正是我所希望的(一个不必预先强制收集的查询)

相关问题