[HADOOP] Hive SQL 코딩 스타일 : 중간 테이블?
HADOOPHive 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.한 가지 중요한 차이점이 있습니다. 하나의 큰 쿼리를 실행하면 옵티마이 저가 더 자유롭게 최적화 할 수 있습니다. 이러한 경우 가장 중요한 최적화 중 하나는 hive.exec.parallel에 설정된 패럴렐 리임입니다. true로 설정하면 독립 단계가 병렬로 실행됩니다. 귀하의 경우, 두 번째 쿼리에서 t1, t2가 그룹별로 더 복잡한 작업을한다고 상상해보십시오. 두 번째 쿼리 t1에서 t2는 동시에 실행되는 반면 첫 번째 스크립트에서는 직렬로 실행됩니다.
한 가지 중요한 차이점이 있습니다. 하나의 큰 쿼리를 실행하면 옵티마이 저가 더 자유롭게 최적화 할 수 있습니다. 이러한 경우 가장 중요한 최적화 중 하나는 hive.exec.parallel에 설정된 패럴렐 리임입니다. true로 설정하면 독립 단계가 병렬로 실행됩니다. 귀하의 경우, 두 번째 쿼리에서 t1, t2가 그룹별로 더 복잡한 작업을한다고 상상해보십시오. 두 번째 쿼리 t1에서 t2는 동시에 실행되는 반면 첫 번째 스크립트에서는 직렬로 실행됩니다.
-
==============================
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.쿼리를 결합하는 것이 좋습니다. 이를 통해 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.알다시피 타이밍에는 큰 차이가 없을 수 있습니다. (a) "저장 지점"/ 중간 롤백 또는 (b) 문제 해결 목적으로 임시 테이블을 유지하려고 할 것입니다. 그렇지 않으면 중간 테이블의 정리 / 삭제를 기억 (또는 자동화)하는 관리 노력이 필요하지 않습니다.
알다시피 타이밍에는 큰 차이가 없을 수 있습니다. (a) "저장 지점"/ 중간 롤백 또는 (b) 문제 해결 목적으로 임시 테이블을 유지하려고 할 것입니다. 그렇지 않으면 중간 테이블의 정리 / 삭제를 기억 (또는 자동화)하는 관리 노력이 필요하지 않습니다.
from https://stackoverflow.com/questions/20957799/hive-sql-coding-style-intermediate-tables by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 연결이 빠른 시작을 거부했습니다. (0) | 2019.08.17 |
---|---|
[HADOOP] hive에서 hh : mm : ss의 평균을 찾는 방법 (0) | 2019.08.17 |
[HADOOP] org.apache.hadoop.mapreduce.Job에 대한 Hadoop MultipleOutputFormat 지원 (0) | 2019.08.17 |
[HADOOP] Hadoop은 다시 시작될 때 MapReduce 기록을 제거합니다. (0) | 2019.08.17 |
[HADOOP] 세미콜론으로 구분 된 필드가있는 하나의 열이있는 .csv 파일에서 Hive 테이블을 만들려면 어떻게해야합니까? (0) | 2019.08.17 |