2014-03-06 1 views
6

아마존 S3에 저장된 데이터를 처리하기 위해 외부 테이블과 함께 하이브를 사용하고 있습니다.특정 날짜까지 하이브를 사용하여 파티션을 추가하는 방법은 무엇입니까?

     DIR s3://test.com/2014-03-01/ 
         DIR s3://test.com/2014-03-02/ 
         DIR s3://test.com/2014-03-03/ 
         DIR s3://test.com/2014-03-04/ 
         DIR s3://test.com/2014-03-05/ 

s3://test.com/2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log 
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_06-26_19-56.log 
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_15-20_12-53.log 
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_22-54_27-19.log 

어떻게 하이브를 사용하여 파티션 테이블을 만들기 위해 다음과 같이

내 데이터를 분할?

CREATE EXTERNAL TABLE test (
    foo string, 
    time string, 
    bar string 
    ) PARTITIONED BY (? string) 
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY '\t' 
    LOCATION 's3://test.com/'; 

누군가가이 질문에 답변 할 수 있습니까? 감사!

답변

25

먼저 오른쪽 테이블 정의로 시작하십시오. 귀하의 경우에는 그냥 당신이 쓴 무엇을 사용합니다 : //test.com/partitionkey=partitionvalue : 기본적으로 하이브

CREATE EXTERNAL TABLE test (
    foo string, 
    time string, 
    bar string 
) PARTITIONED BY (dt string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LOCATION 's3://test.com/'; 

는 컨벤션 S3를 통해 명명 된 하위 디렉토리로 파티션을 기대

. 예를 들어

s3://test.com/dt=2014-03-05 

이 규칙을 따르면 MSCK를 사용하여 모든 파티션을 추가 할 수 있습니다.

당신이 또는이 이름 지정 규칙을 사용하지 않을 수없는 경우, 당신이 모든 파티션을 추가해야합니다

ALTER TABLE test 
    ADD PARTITION (dt='2014-03-05') 
    location 's3://test.com/2014-03-05' 
+0

@ Shanklin Thanks! – brisk

+1

위 쿼리는 구문 오류없이 작동합니다. 그러나 어떤 데이터도로드하지 않습니다. 출력은 0 바이트입니다. 나를 도와 주실 수있으세요? – brisk

+1

ALTER TABLE px_logs ADD PARTITION (ds = date_sub ('$ {DAY}', 1)); 현재 날짜 가져 오기 위해 파이썬 코드를 사용하려고하면 오류가 발생했습니다. FAILED : 구문 분석 오류 : 줄 3시 38 분에서 'date_sub'입력을 인식 할 수 없습니다. – brisk

1

날짜 필드를 사용하여 파티션을 만들려면 아래에 설명 된 것처럼 s3 폴더 구조가 필요합니다.

S3 : 이러한 경우에 //test.com/date=2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log

당신은 외부 테이블을 만들 수 있습니다 파티션 열 날짜 및 하이브 메타 저장소를 업데이트하려면 MSCK REPAIR TABLE EXTERNAL_TABLE_NAME을 실행하십시오.

+0

외부 테이블 테스트 만들기 ( foo는 문자열, 시간 문자열, 바 문자열 ) 행 형식은'\의 t ' LOCATION 3에 의해 종료 FIELDS 구분 ; MSCK REPAIR TABLE 테스트; 나는이 스크립트를 실행했다. s3에서 데이터를로드하지 않습니다. 위의 s3 경로에는 많은 로그 파일이 있습니다 .. MSCK REPAIR TABLE을 사용하는 방법. – brisk

+0

s3 폴더의 출력을 게시 할 수 있습니까? – Venkatesh

+0

출력은 0 바이트 ... – brisk

2

카터 샨 클린 이상 게시 응답 제발 봐. 파일이 디렉토리 구조에 partitionkey = partitionvalue로 저장되어 있는지 확인해야합니다. 즉, 기본적으로 Hive는 파티션이 규칙을 통해 명명 된 하위 디렉토리에 있어야합니다. //test.com/date=20140305/ip-foo-request-2014-03-05_04-20_00-49.log : 당신의 예에서

은이

S3로 저장해야합니다.

단계를 따라야합니다 :

ⅰ) 외부 테이블 만들기) 상기 구조 II에 존재 있는지 데이터를 확인 III) 이제 msck 수리 테이블을 실행합니다.

1

데이터가 s3 위치에 있고 메타 데이터 (emrfs)에서 업데이트되지 않았을 수 있습니다. 이 작업을 먼저 수행하려면 emrfs 가져 오기 및 emrfs 동기화가 필요합니다. 그리고 나서 msck 수리를 적용하십시오.

그것은 <partition name>=<partition value>, 당신은 수동으로 파티션을 추가 할 필요가 준수하지 않는 당신이 디렉토리 구조를 기존의 경우 S3

0

에 존재하는 모든 파티션을 추가합니다. MSCK REPAIR TABLE은 디렉토리를 구조화하지 않으면 작동하지 않습니다.당신은 전체 경로를 지정하지 않고 파티션을 추가 할 수 있습니다

 
CREATE EXTERNAL TABLE test (
    foo string, 
    time string, 
    bar string 
) 
PARTITIONED BY (dt string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LOCATION 's3://test.com/'; 

:처럼 당신이 테이블 작성에 위치를 지정한 후

내가 확인 적이 있지만

ALTER TABLE test ADD PARTITION (dt='2014-03-05') LOCATION '2014-03-05'; 

, 당신이 이동하는 것이 좋습니다 당신의 파티션은 버킷 자체의 폴더가 아닌 버킷 안의 폴더에 저장됩니다. 예 : s3://test.com/에서 s3://test.com/data/까지 //test.com/ '(날짜 문자열)에 의해 구획

관련 문제