2017-01-31 3 views
4

파티션 된 특정 열이있는 테이블에서 아래의 하이브 쿼리를 실행하는 경우 하이브가 전체 테이블 스캔을 수행하지 않고 메타 데이터 자체의 결과를 알아 내야합니다. 이 방법을 사용할 수 있습니까? 나는이 쿼리를 실행하고 때 지금 메타 데이터 쿼리를 위해 하이브를 조정하는 방법은 무엇입니까?

Select max(partitioned_col) from hive_table ; 

, 그 발사지도 작업을 줄이고 나는 그것이 아주 잘 메타 데이터 자체의 값을 알아낼 수있는 동안 그 일을 데이터가 스캔 확신합니다.

답변

3

데이터를 변경할 때마다 테이블 통계를 계산하십시오.

ANALYZE TABLE hive_table PARTITION(partitioned_col) COMPUTE STATISTICS FOR COLUMNS; 

CBO 및 통계 자동 수집 사용 : 아무것도 내가 찾는이 방법을 적용하는 것이 좋습니다 것입니다 도움이되지 않으면

set hive.compute.query.using.stats=true; 
set hive.stats.fetch.partition.stats=true; 
set hive.stats.fetch.column.stats=true; 

:

set hive.cbo.enable=true; 
set hive.stats.autogather=true; 

CBO 사용 통계를 사용하려면이 설정을 사용을 마지막 파티션은 빠름 : 테이블 위치에서 쉘 스크립트를 사용하여 최대 파티션 키를 구문 분석합니다. 아래 명령은 모든 테이블 폴더 경로를 인쇄하고, 정렬하고, 가장 최근에 정렬 된 것을 취하고, 마지막 하위 폴더 이름을 취하며, 파티션 폴더 이름을 파싱하고 값을 추출합니다.

last_partition=$(hadoop fs -ls $TABLE_DIR/* | awk '{ print $8 }' | sort -r | head -n1 | cut -d/-f [number of partition subfolder in the path here] | cut -d = -f 2 

그런 다음

-hiveconf last_partition=$last_partition 
로 스크립트에 전달 $last_partition 변수를 사용