[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.당신은지도를 만드는 컬럼에 헤더를 적용하려면이 옵션을 사용할 수 있습니다. 거기에서 당신은 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,,,,)
from https://stackoverflow.com/questions/18343215/manipulate-row-data-in-hadoop-to-add-missing-columns by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 폭풍 HDFS 커넥터를 사용하여 HDFS에 데이터를 쓰기 (0) | 2019.10.12 |
---|---|
[HADOOP] 선택적으로 IIS가 하이브로 로그 파일을로드 (0) | 2019.10.12 |
[HADOOP] Hadoop2에서 하둡-test.jar은 어디? (0) | 2019.10.12 |
[HADOOP] 네임 노드의 악마의 시작의 오류 (0) | 2019.10.12 |
[HADOOP] 키 PRODUCT_ID에 의해 그룹에서 하이브 명령 오류 발현되지 않음 (0) | 2019.10.12 |