복붙노트

[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. ==============================

    1.먼저 더 나은 도움을 샘플 데이터를 제공합니다.

    먼저 더 나은 도움을 샘플 데이터를 제공합니다.

    실종 된 필드에 토큰 - 어떻게 빈 / 널 (null)을 / 삽입 가능한 모든 열을 포함하는 스키마이 가능 필드를 매핑 할 수 있습니까?

  2. ==============================

    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 내 () 나는 출력 튜플의 경로를 추가 할 수 있습니다.

  3. from https://stackoverflow.com/questions/18323683/selectively-loading-iis-log-files-into-hive by cc-by-sa and MIT license