0

syslog メッセージがタイムスタンプ、ホスト、プログラム名 + pid、およびメッセージの 4 つの列に分割されるように、Hive 外部テーブルを作成しようとしています。テーブルをImpalaでも使用できるようにしたいので(Regex Serdeをサポートしていません)、Regex serdeに頼らずにこれを行いたいと思います。

問題は、4 つのフィールドを持つスキーマを定義し、フィールド セパレータとして "\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

「...からログインしました」は切り捨てられます。

列が 4 つある場合、残りのフィールドを除外するのではなく、最後の列に配置するように Hive に指示する方法はありますか? 貪欲なオプション?

ありがとう

4

1 に答える 1

0

ログ行全体に対して列が 1 つしかない Hive テーブルを定義して解決し、Impala で regexp_extract を使用してビューを作成しました。

Hive で、次のようにテーブルを作成します。

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

次にインパラで:

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;
于 2014-01-15T05:36:24.463 に答える