복붙노트

[HADOOP] Hive SQL 코딩 스타일 : 중간 테이블?

HADOOP

Hive SQL 코딩 스타일 : 중간 테이블?

하이브에서 중간 테이블을 작성하고 삭제해야합니까?

나는 다음과 같이 쓸 수있다.

drop table if exists tmp1;
create table tmp1 as
select a, b, c
from input1
where a > 1 and b < 3;

drop table if exists tmp2;
create table tmp2 as
select x, y, z
from input2
where x < 6;

drop table if exists output;
create table output as
select x, a, count(*) as count
from tmp1 join tmp2 on tmp1.c = tmp2.z
group by tmp1.b;
drop table tmp1;
drop table tmp2;

또는 모든 것을 하나의 진술로 롤백 할 수 있습니다.

drop table if exists output;
create table output as
select x, a, count(*) as count
from (select a, b, c
    from input1
    where a > 1 and b < 3) t1
join (select x, y, z
    from input2
    where x < 6) t2
on t1.c = t2.z
group by t1.b;

분명히 중간 테이블을 두 번 이상 재사용하면 테이블을 만드는 것이 완벽합니다. 그러나 한 번만 사용하면 선택의 여지가 있습니다.

두 가지 모두 시도했지만 벽 시간으로 측정하면 6 % 더 빠르지 만 MapReduce Total 누적 CPU 시간 로그 출력으로 측정하면 4 % 느립니다. 이 차이는 임의의 오차 한계 내에있을 수 있습니다 (다른 프로세스 & c에 의해 발생). 그러나 쿼리를 결합하면 속도가 크게 향상 될 수 있습니까?

또 다른 질문은 중간 테이블이며 한 번만 사용되거나 하이브 코드에서 정상적으로 발생합니까? 가능한 경우 피해야합니까?

해결법

  1. ==============================

    1.한 가지 중요한 차이점이 있습니다. 하나의 큰 쿼리를 실행하면 옵티마이 저가 더 자유롭게 최적화 할 수 있습니다. 이러한 경우 가장 중요한 최적화 중 하나는 hive.exec.parallel에 설정된 패럴렐 리임입니다. true로 설정하면 독립 단계가 병렬로 실행됩니다. 귀하의 경우, 두 번째 쿼리에서 t1, t2가 그룹별로 더 복잡한 작업을한다고 상상해보십시오. 두 번째 쿼리 t1에서 t2는 동시에 실행되는 반면 첫 번째 스크립트에서는 직렬로 실행됩니다.

    한 가지 중요한 차이점이 있습니다. 하나의 큰 쿼리를 실행하면 옵티마이 저가 더 자유롭게 최적화 할 수 있습니다. 이러한 경우 가장 중요한 최적화 중 하나는 hive.exec.parallel에 설정된 패럴렐 리임입니다. true로 설정하면 독립 단계가 병렬로 실행됩니다. 귀하의 경우, 두 번째 쿼리에서 t1, t2가 그룹별로 더 복잡한 작업을한다고 상상해보십시오. 두 번째 쿼리 t1에서 t2는 동시에 실행되는 반면 첫 번째 스크립트에서는 직렬로 실행됩니다.

  2. ==============================

    2.여러 개의 뷰를 만든 다음 끝에 테이블 만 만듭니다. 이를 통해 Hive 옵티마이 저는 맵 감소 단계 수를 줄이고 dimamah와 Nigel이 지적한대로 병렬로 실행할 수 있지만 매우 복잡한 파이프 라인의 가독성을 유지하는 데 도움이됩니다.

    여러 개의 뷰를 만든 다음 끝에 테이블 만 만듭니다. 이를 통해 Hive 옵티마이 저는 맵 감소 단계 수를 줄이고 dimamah와 Nigel이 지적한대로 병렬로 실행할 수 있지만 매우 복잡한 파이프 라인의 가독성을 유지하는 데 도움이됩니다.

    예를 들어 다음과 같이 바꿀 수 있습니다.

    CREATE VIEW IF NOT EXISTS tmp1_view
    AS
    SELECT a, b, c FROM inputs
    where a > 1 and b < 3;
    
    
    create view if not exists tmp2_view as
    select x, y, z_
    from input2
    where x < 6;
    
    drop table if exists output;
    create table output as
    select x, a, count(*) as count
    from tmp1_view join tmp2_view on tmp1_view.c = tmp2_view.z
    group by tmp1_view.b;
    
  3. ==============================

    3.쿼리를 결합하는 것이 좋습니다. 이를 통해 Hive 쿼리 최적화 프로그램이 쿼리를 최적화 할 수 있습니다.

    쿼리를 결합하는 것이 좋습니다. 이를 통해 Hive 쿼리 최적화 프로그램이 쿼리를 최적화 할 수 있습니다.

    이 바보 같은 쿼리를 고려하십시오.

    SELECT COUNT(*) FROM (SELECT * FROM clicks WHERE dt = '2014-01-07') t;
    

    실행하면 하나의 MapReduce 작업 만 시작됩니다.

    중간 테이블 사용

    CREATE TABLE tmp AS SELECT * FROM clicks WHERE dt = '2014-01-07';
    SELECT COUNT(*) FROM tmp;
    

    분명히 두 개의 MapReduce 작업을 실행합니다.

    따라서 질문에 대답하기 위해 : 예, 쿼리를 결합하면 속도가 향상 될 수 있습니다.

  4. ==============================

    4.알다시피 타이밍에는 큰 차이가 없을 수 있습니다. (a) "저장 지점"/ 중간 롤백 또는 (b) 문제 해결 목적으로 임시 테이블을 유지하려고 할 것입니다. 그렇지 않으면 중간 테이블의 정리 / 삭제를 기억 (또는 자동화)하는 관리 노력이 필요하지 않습니다.

    알다시피 타이밍에는 큰 차이가 없을 수 있습니다. (a) "저장 지점"/ 중간 롤백 또는 (b) 문제 해결 목적으로 임시 테이블을 유지하려고 할 것입니다. 그렇지 않으면 중간 테이블의 정리 / 삭제를 기억 (또는 자동화)하는 관리 노력이 필요하지 않습니다.

  5. from https://stackoverflow.com/questions/20957799/hive-sql-coding-style-intermediate-tables by cc-by-sa and MIT license