[HADOOP] 선택적으로 IIS가 하이브로 로그 파일을로드
HADOOP선택적으로 IIS가 하이브로 로그 파일을로드
난 그냥 클라우 데라 플랫폼 하둡 / 돼지 / 하이브 시작하고 효과적으로 쿼리에 대한 데이터를로드하는 방법에 대한 질문이 무엇입니까.
저는 현재 다음 디렉토리 구조를 HDFS에로드 IIS 통나무 ~ 50 기가 바이트가 :
나는 하이브 테이블에 모든 로그를로드하고 싶습니다.
나는 두 가지 문제 / 질문 :
내 첫 번째 문제는 웹 서버의 일부가 제대로 구성되지 않았을 수 있습니다 및 모든 열없이 IIS 로그를 가질 것입니다. 이러한 잘못된 로그는 모든 열을 포함하는 스키마에 로그에서 사용할 수있는 컬럼을 맵핑하는 추가 처리가 필요합니다.
데이터는 문제가 모든 열이 활성화하지 않을 경우, 로그는 활성화 된 열이 포함되어 있다는 것입니다 공간으로 구분합니다. 데이터가 비어있는 열을 포함하지 않기 때문에 하이브가 자동으로 널 (null)을 삽입 기운 다. 나는 전체 스키마에 로그에서 사용할 수있는 컬럼을 맵핑 할 수 있어야합니다.
예 좋은 로그 :
#Fields: date time s-ip cs-method cs-uri-stem useragent
2013-07-16 00:00:00 10.1.15.8 GET /common/viewFile/1232 Mozilla/5.0+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/27.0.1453.116+Safari/537.36
예 누락 된 기둥 (CS-방법 및 사용자 에이전트)로 로그인 :
#Fields: date time s-ip cs-uri-stem
2013-07-16 00:00:00 10.1.15.8 /common/viewFile/1232
없는 열이있는 로그는 다음과 같이 전체 스키마에 매핑 할 필요가있다 :
#Fields: date time s-ip cs-method cs-uri-stem useragent
2013-07-16 00:00:00 10.1.15.8 null /common/viewFile/1232 null
실종 된 필드에 토큰 - 어떻게 빈 / 널 (null)을 / 삽입 가능한 모든 열을 포함하는 스키마이 가능 필드를 매핑 할 수 있습니까? 나는 돼지 스크립트를 처리 할 수있는이 뭔가?
어떻게 하이브 테이블 있도록이 하이브에서 쿼리 수 내 디렉토리 구조의 예에서, 즉 조직과 하위 조직 HDFS 경로 정보를 포함하도록 정의 할 수 있습니다? 나는 또한 제대로 하나의 하이브 테이블에 여러 디렉토리에서 데이터를 가져 오는 방법에 확신입니다.
해결법
-
==============================
1.먼저 더 나은 도움을 샘플 데이터를 제공합니다.
먼저 더 나은 도움을 샘플 데이터를 제공합니다.
실종 된 필드에 토큰 - 어떻게 빈 / 널 (null)을 / 삽입 가능한 모든 열을 포함하는 스키마이 가능 필드를 매핑 할 수 있습니까?
-
==============================
2.나는 돼지 UDF (사용자 기능을 정의)를 모두 내 문제를 해결할 수 있었다
나는 돼지 UDF (사용자 기능을 정의)를 모두 내 문제를 해결할 수 있었다
난 정말해야 할 일을했을 모든 #로 시작하는 IIS 헤더를 처리 할 수있는 몇 가지 논리를 추가합니다. 아래는 내가 사용 GETNEXT ()에서 미리보기가, 다른 모든 mr2ert의 예제 코드와 동일합니다.
부품 : 값 [0] .equals ( "# 필드")를 참조하십시오.
@Override public Tuple getNext() throws IOException { ... Tuple t = mTupleFactory.newTuple(1); // ignore header lines except the field definitions if(values[0].startsWith("#") && !values[0].equals("#Fields:")) { return t; } ArrayList<String> tf = new ArrayList<String>(); int pos = 0; for (int i = 0; i < values.length; i++) { if (fieldHeaders == null || values[0].equals("#Fields:")) { // grab field headers ignoring the #Fields: token at values[0] if(i > 0) { tf.add(values[i]); } fieldHeaders = tf; } else { readField(values[i], pos); pos = pos + 1; } } ... }
그런 다음 GETNEXT 내 () 나는 출력 튜플의 경로를 추가 할 수 있습니다.
from https://stackoverflow.com/questions/18323683/selectively-loading-iis-log-files-into-hive by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브 : 어떻게 출력 HiveQL을 사용하여 고유 한 기본 키를 SELECT 쿼리를 할까? (0) | 2019.10.12 |
---|---|
[HADOOP] 폭풍 HDFS 커넥터를 사용하여 HDFS에 데이터를 쓰기 (0) | 2019.10.12 |
[HADOOP] 없는 열을 추가 할 수 하둡에 행 데이터를 조작 (0) | 2019.10.12 |
[HADOOP] Hadoop2에서 하둡-test.jar은 어디? (0) | 2019.10.12 |
[HADOOP] 네임 노드의 악마의 시작의 오류 (0) | 2019.10.12 |