2013-06-26 5 views
2

Я ищу Postgres (фактически Redshift), эквивалентный Hive's parse_url(..., 'HOST').Как разбирать хост из строки в Redshift?

Postgres docs говорят, что у него есть парсер URL как часть его полнотекстового поиска. Это сообщение в блоге имеет a regex, который может быть или не быть пуленепробиваемым. Что лучше?

ответ

1

Если вы не использовали Redshift, я бы сказал: «Используйте PL/Perlu, PL/Python или один из других процедурных языков для получения регулярного парсера URL». Поскольку у вас есть запатентованная вилка Pg 8.1, вам придется согласиться на хакерское регулярное выражение, которое я подозреваю.

Невозможно получить доступ к полнотекстовому поисковому поисковому парсеру с уровня SQL. Вы могли бы написать расширение C, чтобы легко вывести функцию на SQL, но, конечно, вы не можете установить расширение в Redshift, так что вам это не поможет.

Время злоупотреблять регулярными выражениями.

(кстати, спасибо за фактически сказать, что вы на красном смещении; слишком много людей говорят «PostgreSQL», когда они означают «неопределенно PostgreSQL на основе размещенного версии ParAccel»)

+0

FYI, кто-то также предложил применить функцию Hive для импорта в Redshift, чтобы предварительно вычислить его в другое поле. – dfrankow

+0

@dfrankow Конечно, но вы хотели что-то сделать * в * БД. Если стоимость пространства не вызывает беспокойства, то предварительное разбиение URL на отдельные поля было бы идеальным. –

+0

Функции регулярного выражения PostgreSQL не поддерживаются в Redshift, но в строковых операциях достаточно включить синтаксический анализ хоста. См. Мой ответ. – Sim

8

До Redshift начинает поддержку функции регулярных выражений из PostgreSQL, если вы хотите, чтобы получить хост из-за HTTP/S URL в Redshift SQL вы должны сделать что-то вроде:

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

Redshift теперь имеет REGEXP_SUBSTR функцию:

он ищет там gular выражение в строке и возвращает первую подстроку, которая соответствует. Один пример регулярного выражения для извлечения хоста:

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

Nice regex fu! Диапазон символов, который не содержит косой черты, за которой следует период, за которым следует другой диапазон символов, который не содержит косой черты или точки с запятой. –

+0

'SELECT REGEXP_SUBSTR ('http://www.google.com/foo?a=b', '[^ /] + \\. [^ /:] +')' => '{" Regexp_substr "=> «http»} '(в кластере с красным смещением) –