регулярное выражение для строки с несколькими разделителями в улье - PullRequest
0 голосов
/ 11 декабря 2011

Я использую serde для чтения данных в определенном формате с разделителем ||, и в моей строке данных никогда не появятся тройные каналы, такие как |||.

Одна строка моих данных может выглядеть как: aaa||bbb||ccc||ddd, и я создаю таблицу улья, как показано ниже:

CREATE TABLE test_log(
host STRING,
identity STRING,
user STRING,
time STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^\\|]*)\\|{2}([^\\|]*)\\|{2}([^\\|]*)\\|{2}([^\\|]*)",
"output.format.string" = "%1$s %2$s %3$s %4$s")
STORED AS TEXTFILE;

Кажется, что читать данные нормально, но, очевидно, input.regex не совсем корректно, когда сталкиваются с некоторыми данными, такими как: a|bc||edf||g|g||ghi.Я пытался найти помощь в книге «Освоение регулярных выражений», но это не сработало.

Можно ли читать и извлекать данные в указанном выше формате только с определенным input.regex?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

Кажется, я нашел решение, используя регулярное выражение .

Для таких данных, как "a|b|c||d|e|f||g|h|i", я могу прочитать строку с

"input.regex" = "(.*)(?=\\|\\|)\\|{2}(.*)(?=\\|\\|)\\|{2}(.*)"

Работает нормально, и рисунок чёткий.

0 голосов
/ 11 декабря 2011

Теперь вы захватываете только группы, которые разделены парами каналов, но сами по себе не содержат символов каналов: ([^\\|]*). Если вы измените это значение на ((?:[^\\|]+\\|)*[^\\|]+), то каждая группа сможет содержать отдельные каналы где-то посередине (например, a|bc или gg|g), но не сможет начинаться или заканчиваться с помощью канала, поскольку это будет вызвать неоднозначность (например: ab|||cd можно разделить либо на ab| и cd, либо на ab и |cd).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...