2014-01-11 10 views
0

Я пытаюсь создать внешнюю таблицу Hive, чтобы сообщение syslog разбивалось на четыре столбца: временная метка, хост, имя программы + pid и сообщение. Я хочу сделать это, не прибегая к Regex serde, потому что я также хочу, чтобы таблица использовалась Impala (которая не поддерживает Regex Serde).Таблица улов для данных Syslog

Проблема: если я определяю схему с четырьмя полями и укажу «\ 040» в качестве разделителя полей, я получаю только первую строку сообщения. Например, эта строка журнала:

2014-01-01T04:00:00 myhost sshd[9008]: joe logged in from 192.168.1.1 with password .... 

получает отображается как:

timestamp: 2014-01-01T04:00:00 
host: myhost 
prog: sshd[9008]: 
msg: joe 

"вошел в систему с ...." получает отрубили.

Учитывая, что есть четыре столбца, есть ли способ сказать, что Улей оставил оставшиеся поля в последнем столбце, а не оставлял их? Жадный вариант?

Благодаря

+0

Я решил ее определения таблицы улей, который имеет только один столбец, для всей строки журнала а затем используйте regexp_extract в Импале, чтобы создать представление. –

ответ

0

Я решил ее определения таблицы улей, который имеет только один столбец, для всей строки журнала, а затем использовать regexp_extract в Impala, чтобы создать представление.

В Шуе создать таблицу:

create EXTERNAL TABLE hive_syslog_table (logline STRING) LOCATION '/logs'; 

Тогда в Impala:

create view syslog_view as select regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)',1) ts, regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)',2) host, regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)([:\\/\\[\\ ])\\s+(.+)',3) prog, regexp_extract(logline,'(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)',4) msg from hive_syslog_table; 

 Смежные вопросы

  • Нет связанных вопросов^_^