2014-10-16 5 views
0

내가 하나가 하이브를 최적화 할 수있는 가장 좋은 방법입니다 알고 싶습니다 c를이 세 가지 후보 중 두 테이블을 조인 (0.12) 쿼리 (왜, 아마도 이해) :최적화가 HIVE 쿼리에 조인

SELECT * FROM a join b ON (a.id = b.id) WHERE b.dt = "2014-09-01"; 

또는

SELECT * FROM a JOIN b ON (a.id = b.id AND b.dt = "2014-09-01") ; 

또는

SELECT * FROM a JOIN ( 
    SELECT * FROM b where dt = "2014-09-01") c 
ON a.id = c.id ; 

는 그래서, 테이블이 저장 및 분할하는 방법에 대한 제어 할 수 없습니다 제 질문은 특정 사례보다 일반적인 우수 사례 인 에 관한 것입니다. 나는 a.id = b.id가 b.dt = '2014-09-01'일 때만 가능하다는 것을 알고 있으므로 속도를 향상시키기 위해 결합 할 수있는 데이터를 제한하고자합니다 (b는 거대한 테이블 임) .

HIVE 문서 읽기 일반적으로 a가 가장 작은 테이블이고 b가 (매우) 큰 테이블이라는 것을 이해했습니다. 그러나 위의 다른 쿼리가 성능면에서 어떻게 작동하는지 이해할 수는 없습니다.

내가 사용할 수있는 다른 방법이 있다면 잘 알고 싶습니다.

+0

테이블이 얼마나 큽니까, 메모리에 맞습니까? – www

+0

나는 이것을 사용할 수 있다고 말하고 싶다. 일반적으로는 할 수 없다. – lucacerone

답변

1

3 가지 모두가 MR 작업, 사용 된 맵퍼 및 계획에 대해 동일하다는 것을 알 수 있습니다. 테이블 a가 충분히 작 으면 map-side 조인 최적화가 활용됩니다. 표 b에서 필터의 위치를 ​​전환하면 표 b에서 데이터를 검색하는 데 사용되는 매퍼의 수에 영향을 미치지 않습니다. 테이블 b가 하위 쿼리에있는 경우에도 마찬가지입니다.

테이블 b가 col dt로 분할 된 경우에만 최적화가 파티션 정리가됩니다. 그렇지 않으면 전체 테이블 스캔과 비교하여 매퍼 수를 줄이는 유일한 요소가 나타납니다.