2013-01-11 2 views
5

데이터 분석을 위해 Hadoop - 하이브를 사용하는 통신 프로젝트에서 작업하고 있습니다. 언젠가는 수백만 건의 기록을 남길 것입니다. 지정한 요일 이후에는 저장 용량이 없으므로 이전 데이터를 삭제해야합니다. 레코드를 삭제하는 가장 좋은 방법은 무엇입니까?Hadoop - 하이브 : 지정한 요일보다 오래된 데이터 삭제

추가 정보 :

그 하이브 테이블이 채워 날짜를 갖는 열이있을 것이다.

답변

11

하이브 테이블에서 "하루"파티션을 사용하는 것이 유스 케이스에 도움이된다고 생각합니다. "하루"가 단 하나의 컬럼 일 경우 테이블을 관리하고 정리하는 것이 어려워집니다. 데이터를 추가 할 때

create table mytable (
    ... 
) partitioned by (day string) 

그래서 당신은 예를 들어 것이다 다음 : 파티션 정말 하이브에서 의미

은 각 "하루"그래서 예를 들면

에 대한 디렉토리를 것입니다 HDFS의 구조 :

/user/hive/warehouse/mytable/day=2013-01-10 
/user/hive/warehouse/mytable/day=2013-01-11 
... 

그리고 각 파티션에 해당 날짜의 콘텐츠가 있습니다.

그리고 이전 데이터가 사소하게 삭제, 당신은 예를 들어 매일 실행 (명령 date --date '30 days ago' +\%Y-\%m-\%d을 사용하여 예를 들어) 전 x 일에 대한 데이터를 삭제하고 간단하게 할 다음 명령을 cron 작업 할 수 :

hadoop fs -rmr -skiptrash /user/hive/warehouse/mytable/day=`date --date '30 days ago' +\%Y-\%m-\%d` 

show partitions mytable을 수행하면 하이브 테이블에 파티션이 남아 있지만 데이터를 삭제 한 파티션에 대한 쿼리는 아무 것도 반환하지 않습니다. 당신이 정말로 메타 스토어에서 파티션을 삭제하려면 다음 명령을 사용해야합니다 : 나는 잠시 동안 성공적으로 매우 유사한 패턴을 사용하고

ALTER TABLE mytable DROP PARTITION (day='xxxx-xx-xx'); 

그것은 잘 작동합니다.

관련 문제