使用 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 而不是平面文件