如何从 Redshift 中的字符串中解析主机?

Posted

技术标签:

【中文标题】如何从 Redshift 中的字符串中解析主机?【英文标题】:How to parse host out of a string in Redshift? 【发布时间】:2013-06-26 03:19:17 【问题描述】:

我正在寻找相当于 Hive's parse_url(..., 'HOST') 的 Postgres(实际上是 Redshift)。

Postgres docs 说它有一个 URL 解析器作为其全文搜索的一部分。这篇博文有a regex,它可能是防弹的,也可能不是。什么是最好的?

【问题讨论】:

【参考方案1】:

Redshift 现在有一个REGEXP_SUBSTR 函数:

它在字符串中搜索正则表达式并返回第一个匹配的子字符串。提取主机的正则表达式示例:

select REGEXP_SUBSTR(url, '[^/]+\\.[^/:]+') from my_table;

【讨论】:

不错的正则表达式!不包含斜线的字符范围,后跟句点,后跟不包含斜线或分号的另一个字符范围。 SELECT REGEXP_SUBSTR('http://www.google.com/foo?a=b', '[^/]+\\.[^/:]+') => "regexp_substr"=>"http"(在红移集群上) 同时删除可选的“www”。你可以调整它:从 my_table 中选择 REGEXP_SUBSTR(url, '[^/(www.)]+\\.[^/:]+') 作为主机名 “:”是必须的吗?在什么情况下会返回错误的值?【参考方案2】:

在 Redshift 开始支持 PostgreSQL 的正则表达式函数之前,如果您想从 Redshift SQL 中的 HTTP/S URL 中获取主机,您必须执行以下操作:

select split_part(url, '/', 3) as host from my_table

【讨论】:

【参考方案3】:

如果您不使用 Redshift,我会说“使用 PL/Perlu、PL/Python 或其他过程语言之一来获取常规 URL 解析器”。由于您使用的是 Pg 8.1 的专有分支,因此您将不得不接受我怀疑的 hacky regexp。

无法从 SQL 级别访问全文搜索 URL 解析器。你可以编写一个 C 扩展来很容易地将函数公开给 SQL,但是你当然不能在 Redshift 中安装扩展,所以它对你没有任何好处。

是时候滥用正则表达式了。

(顺便说一句,感谢您实际上说您正在使用 redshift;当他们的意思是“一个模糊的基于 PostgreSQL 的 ParAccel 托管版本”时,太多人说“PostgreSQL”)

【讨论】:

仅供参考,有人还建议在导入 Redshift 时应用 Hive 函数以将其预计算到不同的字段中。 @dfrankow 当然可以,但是您想要在数据库中 执行此操作。如果空间成本不是问题,那么将 URL 预先拆分为单独的字段将是理想的。 Redshift 不支持 PostgreSQL 的正则表达式函数,但字符串操作足以解析主机。看我的回答。

以上是关于如何从 Redshift 中的字符串中解析主机?的主要内容,如果未能解决你的问题,请参考以下文章

Redshift:如何从字符串列表中匹配最长的正则表达式字符串

如何使用堡垒主机通过 SSH 连接到 Redshift

如何从 Redshift 的正则表达式组中选择第一个结果?

您可以从 Redshift 中的 python UDF 返回多个值吗?

如何使用redshift从字符串中删除反斜杠?

需要从redshift中的日期列中划分月份和年份