관리 메뉴

Hee'World

[1004jonghee]HIVE 외부 데이터 업로드 하여 SELECT 하기 본문

BigData/Hive

[1004jonghee]HIVE 외부 데이터 업로드 하여 SELECT 하기

Jonghee Jeon 2013. 7. 12. 15:11

-- 출처 wikibooks"시작하세요 하둡프로그래밍"--

 HIVE는  HIVE QL 이라는 SQL문과 유사한 언어를 사용한다. 하지만 기존의 SQL문과는 차이가 있다.

1. 하이브에서 사용하는 데이터가 HDFS에 저장되는데, HDFS가 한번 저장한 파일은 수정할 수 없기 때문에 UPDATE와 DELETE를 사용할 수 없다. 같은 이유로 INSERT도 비어 있는 테이블에 입력을 하거나, 이미 입력된 데이터를 덮어 쓰는 경우에만 가능하다. 그래서 HIVESQL은 "INSERT OVERWRITE"라는 키워드를 사용하게 된다.

2. SQL은 어떠한 절에서도 서브쿼리를 사용할 수 있지만, 하이브QL은 FROM 절에서만 서브쿼리를 사용할 수 있다.

3. SQL의 뷰는 업데이트할 수 있고, 구체화된 뷰 또는 비구체화된 뷰를 지원한다. 하지만 하이브QL의 뷰는 읽기 전용이고, 비구체화된 뷰만 제공한다.

4. SELECT 문을 사용할 때 HAVING 절을 사용할 수 없다.

5. 저장 프로시져(store procedure)를 지원하지 않는다. 대신 맵리듀스 스크립트를 실행할 수 있다.

 

사용할 외부 데이터는 미국 항공 운항 지연 데이터를 사용하였습니다. 하이브는 메타스토어에 저장된 테이블을 분석한다. 데이터를 조회하기전에 먼저 테이블을 생성해야 한다.

HIVE에 접속하여 아래와 같이 테이블을 생성합니다.

CREATE TABLE airline_delay(

Year    INT, 
Month    INT, 
DayofMonth    INT, 
DayOfWeek    INT, 
DepTime    INT, 
CRSDepTime    INT, 
ArrTime    INT, 
CRSArrTime    INT, 
UniqueCarrier    STRING, 
FlightNum    INT, 
TailNum    STRING, 
ActualElapsedTime    INT, 
CRSElapsedTime    INT, 
AirTime    INT, 
ArrDelay    INT, 
DepDelay    INT, 
Origin    STRING, 
Dest    STRING, 
Distance    INT, 
TaxiIn    INT, 
TaxiOut    INT, 
Cancelled    INT, 
CancellationCode    STRING COMMENT 'A = carrier, B = weather, C = NAS, D=security' , 
Diverted    INT COMMENT '1 = yes, 0 = no', 
CarrierDelay    STRING, 
WeatherDelay    STRING, 
NASDelay    STRING, 
SecurityDelay    STRING, 
LateAircraftDelay STRING

)

Partitioned by (DelayYear INT)
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    STORED AS TEXTFILE;

 

CREATE TABLE 테이블과 같은 방식으로 테이블을 생성하며, 각 칼럼은 콤마로 구분합니다.

PARTITIONED BY(DelayYear INT) 절은 테이블의 파티션을 설정하는 부분입니다. 하이브는 쿼리문의 수행속도를 향상시키기 위해 파티션을 설정할 수 있습니다. 파티션을 설정하면 해당 테이블의 데이터를 파티션별로 디렉토리를 생성해서 저장하게 됩니다.

STORED A 절은 데이터 저장 파일 포맷을 의미 합니다. 텍스트 파일을 위한 TEXTFILE과 시퀀스 파일을 저장하기 위한 SEQUENCEFILE을 지원합니다.

 

airline_delay 테이블에 데이터를 업로드 해보겠습니다.

우선 미국 항공 운항 지연 데이터 중 2008년 파일을 다음과 같이 첫번째 줄을 삭제한 후, 2008_new.cvs로 새로 저장합니다. 첫 번째 줄을 삭제 한 이유는 테이블에 업로드할 때 첫번째 줄도 함께 입력되기 때문입니다. 첫 번째 줄은 칼럼명인데, 하이브 테이블에 등록되면 INT 칼럼에 해당하는 값들이 모두 NULL로 입력됩니다. 번거로움을 없애기 위해 삭제 해줍니다. 

 

 

하이브CLI에서 다음과 같이 LOAD DATA를 입력합니다. OVERWRITE INTO 절은 중복된 데이터가 있어도 무시하고 입력한다는 의미 입니다. 그리고 PARTITION절은 파티션 키인 delayYear 값을 2008로 설정해서 데이터를 입력하는 설정입니다. 참고로 테이블에는 파티션을 설정했는데, 테이블을 등록할 때 PARTITION 절을 선언하지 않으면 LOAD DATA 실행 시 오류가 발생합니다. 

 

 

업로드가 완료되면 하이브QL을 입력합니다. 아래와 같이 쿼리문을 실행하면 하이브는 사용자가 입력한 하이브QL을 분석하여 맵리듀스 잡으로 생성해서 실행합니다. 

 

 아래는 쿼리문에 group by 절을 이용한 것입니다.

 

Comments