하둡 / 하이브 파티션 테이블 2
hive> select count(*)
> from airline_delay
> where delayYear='1994' and month =3;
435516
대용량 테이블을 구성할 때는 파티션 테이블 생성을 고려해야합니다.
만약 파티션 테이블을 구성했다면 위와 같은 SQL을 수행할 때 해당 파티션만 스캔을 하기 때문에 검색속도가 빨라집니다. 여기에 인덱스까지 걸어주게 되면 더 좋은 검색속도를 경험할 수 있습니다. 파티션된 테이블에 생성하는 인덱스를 local index라고 하고 파티션 되지 않은 테이블에 생성하는 인덱스를 global index 라고 합니다. global index는 테이블이 큰 만큼 인덱스의 크기도 커지기 때문에 성능이 느릴 수밖에 없습니다. 그래서 local index를 권장합니다.
ㅇ하이브에서 파티션 테이블인지 확인하는 방법
hive> show partitions airline_delay;
delayyear=1994
delayyear=1997
문제309. emp테이블을 deptno를 기준으로 해서 파티션 테이블로 생성하시오.
create table emp_partition
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int,
deptno int )
partitioned by (deptno_pt int)
row format delimited
fields terminated by ','
lines terminated by '\n'
stored as textfile;
문제310. emp.csv를 부서번호별로 각각 분리해서 아래와 같이 3개의 파일을 생성하시오.
10.csv, 20.csv, 30.csv
awk -F ',' '$8==10 {print $0}' emp.csv >> 10.csv
awk -F ',' '$8==20 {print $0}' emp.csv >> 20.csv
awk -F ',' '$8==30 {print $0}' emp.csv >> 30.csv
문제311. 10.csv를 emp_partition 테이블에 입력하시오.
load data local inpath '/home/oracle/10.csv'
overwrite into table emp_partition
partition (deptno_pt='10');
10.csv의 데이터를 emp_patition테이블에 입력했는데 10이라는 이름의 서랍장에 입력했습니다.
문제312. 20.csv를 emp_partition 테이블에 입력하시오.
load data local inpath '/home/oracle/20.csv'
overwrite into table emp_partition
partition (deptno_pt='20');
문제313. 30.csv를 emp_partition 테이블에 입력하시오.
load data local inpath '/home/oracle/30.csv'
overwrite into table emp_partition
partition (deptno_pt='30');
문제314. 부서번호가 20번이고 월급이 3000인 사원의 이름과 월급과 직업을 emp_partition 테이블에서 조회하시오.
hive> select ename, sal, job
> from emp_partition
> where deptno_pt = '20' and sal = 3000;
FORD 3000 ANALYST
SCOTT 3000 ANALYST
문제315. emp_partition 테이블이 파티션 테이블인지 확인하시오.
hive> show partitions emp_partition;
deptno_pt=10
deptno_pt=20
deptno_pt=30