2014-04-25 3 views
0

다음은 일치시키려는 로그 파일의 두 줄입니다. 각 열을 4 개의 열 (날짜, 호스트 이름, 명령, 상태)으로 구분하려고합니다. 행은 행의 날짜, 호스트 이름, 명령 및 상태 탭으로 구분됩니다. 상태 열에는 공백이 포함될 수 있습니다.하이브 Serde Regex가 문자열 패턴을 인식하지 못합니다.

Rubular 나에서
03-24-2014  fm506  TOTAL-PROCESS OK;HARD;1;PROCS OK: 717 processes 
03-24-2014  fm504  CHECK-LOAD  OK;SOFT;2;OK - load average: 54.61, 56.95 

(http://rubular.com/는) 내 정규식 표현은 내가 원하는대로 정확히 일치; 그러나 날짜 열에 대한 내 하이브 테이블을 쿼리 한 후 정규식 문이 HIVE가 찾고있는 것과 일치하지 않는다고 생각하게하는 전체 줄을 얻습니다.

([^] ) \가 ([^] ) \의 ([^] ) \ s의 (. *)

을 S와이 선택의 결과 내 CREATE TABLE 문이다 검색어 :

CREATE EXTERNAL TABLE IF NOT EXISTS sys_results(
date STRING 
,hostname STRING 
,command STRING 
,status STRING 
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*)\\s*([^ ]*)\\s*([^ ]*)\\s*(.*)", 
"output.format.string" = "%1$s %2$s %3$s %4$s" 
) 
STORED AS TEXTFILE 
LOCATION '/user/sys_log_output/sys-results/'; 


select date from sys_results; 
03-24-2014  fm506  TOTAL-PROCESS OK;HARD;1;PROCS OK: 717 processes 

답변

0

나는 그것을 알아 냈습니다. 하이브 정규 표현식은 '\ t'을 사용하여 탭을 인식합니다. input.regex 표현식을 이렇게 변경했습니다. "input.regex"= "([^] ) \의 t ([^]) \ t ([^] ) \ t ([^].)"

관련 문제