본문 바로가기
빅데이터 시스템

데이터 파일 파티셔닝

by 볼록티 2019. 12. 15.
728x90
반응형

-이번장에서 배울 것

0.데이터 파일을 파티셔닝함으로써 쿼리 성능을 어떻게 향상시키는지

 -파티셔닝은 두개의 구문으로 포함된다.

 -Storage: 데이터를 올바른 파티션위치에 놓는 것.

 -Retrieval: 파티션으로부터 쿼리를 통해 분석할 데이터를 얻는 것.

 

1.Impala와 Hive로 파티션된 테이블들을 어떻게 생성하고 조작하는지

 

-하둡은 파티셔닝을 할 수 있다. 

 -Hive와 Impala로 지원한다. --hive-import를 사용할 때, --hive-partition-key 와 --hive-partition-value를 사용하여 sqoop을 통해 파티션할 수 있다.

 -Spark, MapReduce, Flume 들이 파티션된 데이터를 저장하기위해 사용된다.

 

 -Impala/Hive의 파티셔닝 작업 예.

 CREATE EXTERNAL TABLE accounts(

 cust_id INT,

 fname STRING,

 state STRING

 zipcode STRING)

 ROW FORMAT DELIMITED

 FIELDS TERMINATED BY ‘,’

 LOCATION ‘/loudacre/accounts’;

 

-단순한 쿼리문.

 SELECT fname, lname

 FROM accounts

 WHERE state=’NY’;

 

 -파티션닝하기.

 CREATE EXTERNAL TABLE accounts(

 cust_id INT,

 fname STRING, 

 ################ state STRING <- 이부분제거하고 뒤에 PARTITIONED BY로 보냄.

 zipcode STRING) 

 PARTITIONED BY (state STRING)

 ROW FORMAT DELIMITED

 FIELDS TERMINATED BY ‘,’

 LOCATION ‘/loudacre/accounts’;

 

DESCRIBE accounts_by_state;

 -다음을 통해 파티션된 테이블의 컬럼을 알 수 있다.

 

 -Nested Partitions은 파티션 안에 파티션을 넣는다는 의미이다.

  PARTITIONED BY (state STRING, zipcode STRING)

 

 -데이터를 로딩하여 파티션된 테이블로 만드는데는 두가지 방법이 있다 .

 -Dynamic partitioning: Impala/Hive는 자동적으로 로드 타임 때 필요한 새로운 파티션들을   추가한다. 데이터는 열 값을 기반으로 파티션에 저장이 된다.

 -Static partitioning: ADD PARTITION을 사용해서 새로운 파티션들을 정의한다. 데이터를  로드할 때 어느 파티션에 데이터를 넣을지 명시해야 한다.

 

 -Dynamic Partitioning

 -존재하는 데이터를 동적으로 새로운 파티션들을 생성할 수 있다. 

 INSERT OVERWRITE TABLE accounts_by_state

   PARTITION(state)

   SELECT cust_id, fname, lname, address, city, zipcode, state FROM accounts;

 -마지막 열값에 기반하여 자동적으로 파티션이 생성이 된다.

 -파티션이 존재하지 않았다면 생성이 될것이고 , 존재했더라면 덧붙여짐(overwritten).

 

-Static Partitioning

 SELECT event_type, COUNT(event_type) FROM call_log WHERE call_date =“2014-10-01”  GROUP BY event_type;

 다음의 자료를 요약해서 분석을 하게 되겠죠?

 

 CREATE TABLE call_logs( call_time STRING, phone STRING, event_type STRING, details STRING) PARTITIONED BY (call_date STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘ , ’ ;

PARTITIONED BY 를 통해서 파티션 기준 열을 명시를 해주게 된다.

 

ALTER TABLE call_logs

ADD PARTITION (call_date=’2014-10-02’);

 이 커맨드를 통해서 테이블의 메타데이터를 파티션에 추가한다.

 서브 디렉토리를 생성하게 된다. /user/hive/warehouse/call_logs/call_date=2014-10-02

 

LOAD DATA INPATH ‘/mystaging/call-20141002.log’ 

INTO TABLE call_logs 

PARTITION(call_date=’2014-10-02’)

 day의 데이터를 파티션으로 로드한다. 즉 hdfs 의 파일인 call-log-20141002.log를 파티션 서브디렉토리로 옮긴다.



LOAD DATA INPATH ‘/mystaging/call-20141002.log’ 

INTO TABLE call_logs OVERWRITE

PARTITION(call_date=’2014-10-02’)

파티션에 모든 데이터를  OVERWRITE하게 된다.

 -오직 Hive에서 파티션으로 로드하는 데이터를 shortcut한다. Hive는 명시된 파티션이 없다면 파티션을 새로 만든다.

LOAD DATA INPATH ‘/mystaging/call-20141002.log’

INTO TABLE call_logs

PARTITION(call_date=’2014-10-02’);

이 커맨드를 통해서 테이블의 메타데이터가 없으면 파티션에 테이블 메타데이터를 추가한다. 그리고 서브 디렉토리도 원래 없었으면 생성한다. HDFS에 있던 call-20141002.log파일도 파티션의 서브 디렉토리로 옮긴다.

 

-파티션 보기

 SHOW PARTITIONS call_logs; # 파티션 보기

 

-파티션을 추가하거나 삭제하기

ALTER TABLE call_logs

ADD PARTITION (call_date=’2013-06-05’)

LOCATION ‘/loudacre/call_logs/call_date=2013-06-05’;

 

ALTER TABLE call_logs

DROP PARTITION (call_date=’2013-06-06’)



-파티션은 언제 사용하는가?

 1.전체 데이터 셋을 읽는 시간이 너무 오래 걸릴때

 2.쿼리를 파티션 컬럼에 대한 필터링 작업을 빈번하게 사용할 때.

 3.컬럼 자체에 여러 값들이 분리되기 좋은 데이터 일때

 4.데이터를 생성하거나 ETL프로세스를 파일이나 디렉토리 이름으로 분리시킬 때

 5.파티션 컬럼 그자체는 데이터로 포함하지 않습니다.

 

-파티션을 사용하지 않을 때?

 1.파티셔닝 데이터를 수많은 작은 데이터 파일들로 만드는 것을 피해라.

 2.dynamic 파티셔닝할 때 쉽게 발생한다. 예를 들면 고객 한사람의 이름으로 파티셔닝을 하면 수천개의 파티션들이 생산될 가능성이 있다.




 

 

 

 

 

 

 

 

 

 

 

 

 

이글은 서울과학기술대학교 권혁윤 교수님의 강의를 토대로 필기한 내용임을 밝힙니다. :)

728x90
반응형

'빅데이터 시스템' 카테고리의 다른 글

RDD와 함께 스파크 활용하기.  (0) 2019.12.15
스파크 기초  (0) 2019.12.15
Impala와 Hive로 모델링하고 관리하기  (0) 2019.12.15
Impala와 Hive 소개  (0) 2019.12.15
sqoop으로 관계형 데이터 불러오기  (0) 2019.12.15

댓글