복붙노트

[HADOOP] 없는 열을 추가 할 수 하둡에 행 데이터를 조작

HADOOP

없는 열을 추가 할 수 하둡에 행 데이터를 조작

나는 HDFS에 저장된 IIS에서 로그 파일을 가지고 있지만 인해 웹 서버 구성에 로그 중 일부는 모든 열이 없거나 서로 다른 순서로 나타납니다. 나는 그들을 하이브 테이블을 정의 할 수 있도록 공통 스키마를 가지고 파일을 생성합니다.

예 좋은 로그 :

#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+Chrome/27.0.1453.116

실시 예는 열 (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

나쁜 로그가 활성화 열의와 다른 순서로 조합하여 사용할 수 있습니다.

어떻게 로그 파일 내의 필드 행에 따라 전체 스키마에 사용할 수있는 열을 매핑 할 수 있습니다?

편집하다: 일반적으로 나는 인덱스에 DICT 매핑 열 이름으로 내 열 스키마를 정의하여이 접근 것이다. 예 : COL [ '날짜'] 그럼 난 파일에서 #Fields 행을 읽고 사용할 열을 구문 분석하고 파일에 열 인덱스에 헤더 DICT 매핑 헤더 이름을 생성 할 0 COL [ '시간'] = 1 등 = . 그럼 난 인덱스에 의해 헤더를 알고있는 데이터 행을 나머지를 들어, 헤더 = 열 이름으로 내 열 스키마에 그지도 및 널 (null) 데이터가 누락 열을 삽입하는 올바른 순서로 새 행을 생성합니다. 내 문제는 내가 각 맵 내가 각 맵과 #Fields 정보를 공유 할 수있는 방법 만 따라서 실행 이후 하둡 내에서이 작업을 수행하는 방법을 이해하지입니까?

해결법

  1. ==============================

    1.당신은지도를 만드는 컬럼에 헤더를 적용하려면이 옵션을 사용할 수 있습니다. 거기에서 당신은 UDF를 같이 사용할 수 있습니다 :

    당신은지도를 만드는 컬럼에 헤더를 적용하려면이 옵션을 사용할 수 있습니다. 거기에서 당신은 UDF를 같이 사용할 수 있습니다 :

    myudf.py

    #!/usr/bin/python
    
    @outputSchema('newM:map[]')
    def completemap(M):
        if M is None:
            return None
        to_add = ['A', 'D', 'F']
        for item in to_add:
            if item not in M:
                M[item] = None
        return M
    
    @outputSchema('A:chararray, B:chararray, C:chararray, D:chararray, E:chararray, F:chararray')
    def completemap_v2(M):
        if M is None:
            return (None,
                    None,
                    None,
                    None,
                    None,
                    None)
        return (M.get('A', None),
                M.get('B', None),
                M.get('C', None),
                M.get('D', None),
                M.get('E', None),
                M.get('F', None))
    

    지도에 누락 된 튜플에 추가합니다.

    샘플 입력 :

    csv1.in             csv2.in
    -------            ---------
    A|B|C               D|E|F
    Hello|This|is       PLEASE|WORK|FOO
    FOO|BAR|BING        OR|EVERYTHING|WILL
    BANG|BOSH           BE|FOR|NAUGHT
    

    샘플 스크립트 :

    A = LOAD 'tests/csv' USING myudfs.ExampleCSVLoader('\\|') AS (M:map[]); 
    B = FOREACH A GENERATE FLATTEN(myudf.completemap_v2(M));
    

    산출:

    B: {null::A: chararray,null::B: chararray,null::C: chararray,null::D: chararray,null::E: chararray,null::F: chararray}
    (,,,,,)
    (,,,PLEASE,WORK,FOO)
    (,,,OR,EVERYTHING,WILL)
    (,,,BE,FOR,NAUGHT)
    (,,,,,)
    (Hello,This,is,,,)
    (FOO,BAR,BING,,,)
    (BANG,BOSH,,,,)
    
  2. from https://stackoverflow.com/questions/18343215/manipulate-row-data-in-hadoop-to-add-missing-columns by cc-by-sa and MIT license