2014-01-11 2 views
0

syslog 메시지가 timestamp, host, programname + pid 및 message의 4 개 열로 나눠 지도록 하이브 외부 테이블을 만들려고합니다. 나는 Regex serde를 사용하지 않고이 작업을 수행하고자한다. 왜냐하면 나는 임페라 (Regex Serde를 지원하지 않는 테이블)를 사용할 수 있기를 원하기 때문이다.Syslog 데이터의 하이브 테이블

문제는 4 개의 필드로 스키마를 정의하고 "\ 040"을 필드 구분 기호로 지정하면 메시지의 첫 번째 문자열로 끝납니다.

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


가 "에서 로그인 ..."잘려됩니다 예를 들어,이 로그 라인 :로

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

가 매핑됩니다.

네 개의 열이있는 것을 감안할 때 Hive가 필드의 나머지 부분을 남겨 두지 말고 마지막 열에 넣는 방법이 있습니까? 욕심쟁이 옵션?

감사

+0

임팔라에서 regexp_extract를 사용하여보기를 만듭니다. –

답변

0

I는 전체 기록 라인에 대해, 하나의 열이있는 하이브 테이블을 정의하여이를 해결하고 도면을 작성하는 임에 regexp_extract를 사용한다.

하이브

테이블을 만들 : 임에이어서

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

:
I 전체 기록 라인에 대해, 하나의 열이있는 하이브 테이블을 정의하여 해결

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;