[HADOOP] REGEX를 사용하여 Hive 만들기 및로드 쿼리에서 Null 값 가져 오기
HADOOPREGEX를 사용하여 Hive 만들기 및로드 쿼리에서 Null 값 가져 오기
REGEX로 데이터를 저장 해야하는 로그 파일이 있습니다. 아래 쿼리를 시도했지만 모든 NULL 값을로드했습니다. 내 데이터에 잘 작동하는 http://www.regexr.com/에서 REGEX를 확인했습니다.
CREATE EXTERNAL TABLE IF NOT EXISTS avl(imei STRING,packet STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "(IMEI\\s\\d{15} (\\b(\\d{15})([A-Z0-9]+)) )",
"output.format.string" = "%1$s %2$s"
)
STORED AS TEXTFILE;
LOAD DATA INPATH 'hdfs:/user/user1/data' OVERWRITE INTO TABLE avl;
여기에서 수정 해주세요.
샘플 로그 :
[INFO_|01/31 07:19:29] IMEI 356307043180842
[INFO_|01/31 07:19:33] PacketLength = 372
[INFO_|01/31 07:19:33] Recv HEXString : 0000000000000168080700000143E5FC86B6002F20BC400C93C6F000FF000E0600280007020101F001040914B34238DD180028CD6B7801C7000000690000000143E5FC633E002F20B3000C93A3B00105000D06002C0007020101F001040915E64238E618002CCD6B7801C7000000640000000143E5FC43FE002F20AA800C9381700109000F06002D0007020101F001040915BF4238D318002DCD6B7801C70000006C0000000143E5FC20D6002F20A1400C935BF00111000D0600270007020101F001040916394238B6180027CD6B7801C70000006D0000000143E5FBF5DE002F2098400C9336500118000B0600260007020101F0010409174D42384D180026CD6B7801C70000006E0000000143E5FBD2B6002F208F400C931140011C000D06002B0007020101F001040915624238C018002BCD6B7801C70000006F0000000143E5FBAF8E002F2085800C92EB10011E000D06002B0007020101F0010409154C4238A318002BCD6B7801C700000067000700005873
감사.
해결법
-
==============================
1.현재 테이블 정의를 사용하면 정규식으로 원하는 것을 수행하지 않습니다. 그 이유는 file_format이 TEXTFILE로 설정되어 데이터가 SerDe에 도달하기 전에 입력 파일을 줄 (\ r, \ n 또는 \ r \ n)로 분할하기 때문입니다.
현재 테이블 정의를 사용하면 정규식으로 원하는 것을 수행하지 않습니다. 그 이유는 file_format이 TEXTFILE로 설정되어 데이터가 SerDe에 도달하기 전에 입력 파일을 줄 (\ r, \ n 또는 \ r \ n)로 분할하기 때문입니다.
그런 다음 각 줄은 개별적으로 RegexSerDe에 전달되고 정규 표현식과 일치하며 일치하지 않는 항목은 NULL을 반환합니다. 이러한 이유로 여러 줄 정규식은 STORED AS TEXTFILE을 사용하여 작동하지 않습니다. 이것은 또한 모든 NULL 행을 수신 한 이유입니다. 입력의 단일 행이 전체 정규식과 일치하지 않기 때문입니다.
여기에서 한 가지 해결책은 각 레코드가 입력 파일에서 한 줄에만 있도록 데이터를 사전 처리하는 것이지만 원하는 것은 아닙니다.
Hive에서이를 수행하는 방법은 다른 file_format을 사용하는 것입니다.
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
TextInputFormat은 현재 구성에서 textinputformat.record.delimiter라는 구성 변수를 읽습니다. TextInputFormat을 사용하는 경우이 변수는 하나의 레코드가 끝나고 다음 레코드가 시작되는 위치를 Hadoop 및 Hive에 알려줍니다.
따라서이 값을 EOR과 같은 값으로 설정하면 입력 파일이 한 줄이 아니라 EOR로 분할됩니다. 분할에 의해 생성 된 각 청크는 전체 청크, 줄 바꿈 및 모두로 RegexSerDe에 전달됩니다.
이 변수를 여러 위치에서 설정할 수 있지만 이것이이 (및 세션 내에서) 후속 쿼리에 대한 분리 문자 인 경우 다음을 수행 할 수 있습니다.
SET textinputformat.record.delimiter=EOR; CREATE EXTERNAL TABLE ... ... ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = ... "output.regex" = ... ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION ...;
특정 시나리오에서 하나의 예제 레코드 만 제공되었으므로 EOF 대신 textinputformat.record.delimiter에 사용할 수있는 것을 알 수 없으며 두 번째로 캡처하려는 필드를 알 수 없습니다 정규식.
이 두 항목 (1 개 이상의 레코드가있는 샘플 데이터 및 패킷을 캡처하려는 항목)을 제공 할 수 있다면 더 도움이 될 수 있습니다. 현재로서는 정규식이 링크 한 사이트가 아니라 제공 한 샘플 데이터와 일치하지 않습니다.
from https://stackoverflow.com/questions/23668713/getting-null-values-in-hive-create-load-query-with-regex by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] JA017 : 조회 할 수 없음 hadoop 작업 ID (0) | 2019.08.07 |
---|---|
[HADOOP] 결합기 입력 수가 맵의 출력 수보다 많은 이유는 무엇입니까? (0) | 2019.08.07 |
[HADOOP] hadoop pig 문에서 생성 된 mapreduce 코드를 볼 수있는 곳 (0) | 2019.08.07 |
[HADOOP] 콘솔에서 Hadoop 로깅 메시지를 표시하지 않는 방법 (0) | 2019.08.07 |
[HADOOP] 다른 평면 / 간단한 하이브 테이블에서 map [structs]를 사용하여 하이브 테이블을로드하는 방법 (0) | 2019.08.07 |