使用 AWS Athena 或 PrestoDB 正则表达式函数提取字符串

Posted

技术标签:

【中文标题】使用 AWS Athena 或 PrestoDB 正则表达式函数提取字符串【英文标题】:Extract Strings Using AWS Athena or PrestoDB Regex Function 【发布时间】:2021-10-27 12:02:53 【问题描述】:

我有一个名为

的表

日志

和列命名

网址

他的价值是这样的

https://api.abc.com:443/xyz/live/dashboard_critical/v1?cust_id=-1111%7C-1111%7C-1111%7C-1111%7C-1111%7C-1111%7C-1111%7C-1111%7C-1111%7C-1111%7C-1111&model_id=&startdate=2021-06-29&enddate=2021-07-28&wcombo=&site_id=&instance=&unit=&combo=&source=&priority=&verification=&critical=Yes%7Ctrue&percentile=95&startevent=receiveddatetime&endevent=uploadtohostdatetime

我试图提取 '/' OR '?' OR '%7C' OR '&' 之后的所有字符串

我可以单独提取它,但不能同时提取所有 4 个

SELECT regexp_extract_all(url, '\d+[/]*')
FROM logs.url
WHERE request_verb='GET'
        AND REGEXP_LIKE(url, 'https://api.abc.com:443/xyz/live/');

我正在寻找如下输出

[https:,api.abc.com:443,xyz,live,dashboard_critical,v1,cust_id=-1111,-1111,-1111,-1111,-1111,-1111,-1111,-1111,-1111,-1111,-1111,model_id=,startdate=2021-06-29,enddate=2021-07-28,wcombo=,site_id=,instance=,unit=,combo=,source=,priority=,verification=,critical=Yes,true,percentile=95,startevent=receiveddatetime,endevent=uploadtohostdatetime]

【问题讨论】:

【参考方案1】:

您可以使用regexp_split(str, regexp) 函数,作为一个正则表达式模式连接所有值,其中字符串应使用|(或正则表达式)拆分,它将产生所需的数组。注意:某些字符在 Presto CLI 或正则表达式中有特殊含义,需要屏蔽。

select regexp_split(url,'/+|\?|%%7C|&')

正则表达式含义:

/+ - 一个或多个斜线

| - 或

\? - 字面意思是?,需要用反斜杠屏蔽,因为? 在正则表达式中有特殊含义

| - 或

%%7C - 字面意思是%7C% 在 Presto CLI 中有特殊含义,presto 使用双字符表示法进行屏蔽。

| - 或

& - 字面意思是&

得到一个 ARRAY 后,可以将其连接或爆炸等

【讨论】:

非常感谢@leftjoin @user3198755 已编辑:% 仅在 Presto 中具有特殊含义,在正则表达式中没有

以上是关于使用 AWS Athena 或 PrestoDB 正则表达式函数提取字符串的主要内容,如果未能解决你的问题,请参考以下文章

Presto(AWS Athena)中 datefromparts 的替代方法是啥

将数据从 Athena 或 Redshift 获取到 Sage maker 或 AWS Forecast 而不是平面文件

AWS Athena 可以更新或插入存储在 S3 中的数据吗?

AWS Athena 上的偏移量

Prestodb (AWS EMR) 加载分区元数据

使用 AWS Glue Scala 查询 Athena(添加分区)