2017-11-08 4 views
0

HDP 2.6.2 및 하이브를 사용 중입니다.하이브 서브 쿼리 쿼리 최적화

필자는 열을 기반으로 대형 테이블에서 분할 된 테이블을 업데이트하는 중입니다. 쿼리가 제대로 수행되지 않아 그 이유를 이해할 수 없습니다. 아래의 삽입 문은 예를

여기 insert into partitioned_table partition(dt_month) select * from large_table where incremental_string_col > (select last_incremental_col from temp_tab)

나는 가정, 절은 한 번 실행되는에서 하위 쿼리하고 결과는 캐시 또는 기본적으로 하나의 행이 모든 노드에 출하되는 전체 temp_tab 테이블 CBO에 의해하지만 그냥 doesnt 문자열뿐만 아니라 리터럴로 문자열 값을 퍼팅 것으로 보인다!

테이블을 하이브에 캐시해야한다고 명시 할 수 있습니까? 쿼리를 한 번만 실행하고 결과를 캐시해야한다고 명시 적으로 지정할 수 있습니까? 여기에 무엇이 누락 되었습니까?

문자열이 가장 좋은 경우는 아니지만 필자는 그 부분을 이해합니다.

도움이 될 것입니다!

+0

하이브 조인의 불평등은 내가 기억할 수있는 것으로부터 지원되지 않기 때문에 mapjoin을 사용할 수 없습니다. –

답변

0

그런 다음 불평등 조건에 의해 행을 필터링 단일 행 부질의에 참여 크로스 지도를 사용할 수 있습니다

select * 
    from large_table l 
     cross join (single_row_subquery) s 
where l.incremental_string_col>s.last_incremental_col; 

또는 분리 된 스크립트에서 하위 쿼리를 계산하고 여기에 같은 hivevar 변수를 전달 : https://stackoverflow.com/a/37821218/2700344

+0

단일 행 하위 쿼리가있는 맵 조인 또한 성능이 좋지 않습니다. 나는 슬프게도 다른 옵션을 사용해야한다고 생각해.하지만이 일을하는 더 우아한 방법이 있니? 어쩌면 같은 하이브 세션에서? –

+0

mapjoin이 작동하는 경우 join이없는 경우와 거의 동일해야합니다. – leftjoin

+0

mapjoin이 작동하는지 어떻게 확인할 수 있습니까? 어떤 최적화가 적용되었는지 확인할 방법이 있습니까? 나는 명시 적으로 이것을 힌트로 선택하려고했지만 성능은 매우 떨어졌습니다. –