복붙노트

[HADOOP] HIVE로 테이블을 어떻게 분할 할 수 있습니까?

HADOOP

HIVE로 테이블을 어떻게 분할 할 수 있습니까?

나는 며칠 동안 하이브와 놀았지만 여전히 파티션이 힘들다.

몇 달 동안 Hadoop에 Apache 로그 (결합 형식)를 기록했습니다. 그들은 행 텍스트 형식으로 저장되며, 날짜별로 구분됩니다 (flume을 통해). / logs / yyyy / mm / dd / hh / *

예:

/logs/2012/02/10/00/Part01xx (02/10/2012 12:00 am)
/logs/2012/02/10/00/Part02xx
/logs/2012/02/10/13/Part0xxx (02/10/2012 01:00 pm)

결합 된 로그 파일의 날짜는 [10 / Feb / 2012 : 00 : 00 : 00 -0800] 형식을 따릅니다.

Hive에서 물리적 파티션을 사용하는 파티션이있는 외부 테이블을 만들려면 어떻게해야합니까? 하이브 파티션에 대한 좋은 문서를 찾을 수 없습니다. 관련 질문을 찾았습니다.

하이브를 사용하여 외부 테이블에 로그를로드하면 좋은 형식 (2 월 <=> 02)이 아니기 때문에 시간과 파티션을 나눌 수 없습니다. 비록 그것이 좋은 형식이라 할지라도 "10/02/2012 : 00 : 00 : 00 -0800"문자열을 여러 디렉토리 "/ 2012 / 02 / 10 / 00"로 변환하는 방법은 무엇입니까?

결국 돼지 스크립트를 사용하여 원시 로그를 하이브 테이블로 변환 할 수 있지만이 시점에서 하이브 대신 돼지를 사용하여 내보고를 수행해야합니다.

해결법

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

    1.내가 올바르게 이해하면 디렉토리 로그에서 4 레벨 깊이에있는 폴더에 파일이 있습니다. 이 경우 테이블을 path 'logs'로 외부 테이블로 정의하고 year, month, day_of_month, hour_of_day의 4 개의 가상 필드로 분할합니다.

    내가 올바르게 이해하면 디렉토리 로그에서 4 레벨 깊이에있는 폴더에 파일이 있습니다. 이 경우 테이블을 path 'logs'로 외부 테이블로 정의하고 year, month, day_of_month, hour_of_day의 4 개의 가상 필드로 분할합니다.

    파티션은 기본적으로 Flume에 의해 수행됩니다.

    EDIT 3/9 : 많은 세부 사항은 Flume이 파일을 쓰는 방법에 달려 있습니다. 그러나 일반적으로 DDL은 다음과 같이 보일 것입니다.

    CREATE TABLE table_name(fields...)
    PARTITIONED BY(log_year STRING, log_month STRING, 
        log_day_of_month STRING, log_hour_of_day STRING)
    format description
    STORED AS TEXTFILE
    LOCATION '/your user path/logs';
    

    EDIT 3/15 : zzarbi 요청에 따라 테이블이 생성 된 후 생성 된 파티션에 대한 정보를 Hive에 알려야한다는 메모를 추가합니다. Flume 또는 다른 프로세스가 새 파티션을 만드는 한 반복적으로 수행해야합니다. 파티션 질문으로 외부 만들기에 대한 내 대답을 참조하십시오.

  2. from https://stackoverflow.com/questions/9626789/how-can-i-partition-a-table-with-hive by cc-by-sa and MIT license