SerDe

서데(SerDe)

서데(SerDe, Serializer/Deserialaizer)는 하이브가 데이터를 해석하는 방법을 제공한다. 하이브는 서데와 파일 포맷을 이용하여 데이터를 읽고, 쓸 수 있다.

하이브는 파일을 읽을 때 파일포맷(FileFormat)을 이용하고, 디시리얼라이저(Deserializer)를 이용하여 원천 데이터를 테이블 포맷에 맞는 로우 데이터로 변환. 파일을 쓸때는 로우 데이터를 시리얼라이저(Serializer)를 이용하여 키, 밸류 형태로 변경하고 파일포맷을 이용하여 저장 위치에 쓴다. 서데는 doDeserialize(), doSerialize() 를 구현하여 각각의 경우를 처리한다.

  • HDFS files –> InputFileFormat –> [key, value] –> Deserializer –> Row object
  • Row object –> Serializer –> [key, value] –> OutputFileFormat –> HDFS files



하이브 기본 서데

하이브에서 제공하는 기본 서데는 7가지(Avro, ORC, RegEx, Thrift, Parquet, CSV, JsonSerDe)가 있다. 각 서데는 STORED AS 에 지정하는 파일의 포맷에 따라 자동으로 선택된다.

Avro, ORC, Parquet 은 서데와 인풋, 아웃풋 포맷이 설정된다. 나머지는 기본 LazySimpleSerDe와 파일에 따른 인풋, 아웃풋 포맷이 설정된다. 테이블에 설정되는 서데는 desc formatted 명령으로 확인이 가능.

-- ORC 테이블 생성 
CREATE TABLE orc_tbl (
  col STRING
) STORED AS ORC;

-- ORC 테이블 확인 
hive>desc formatted orc_tbl;

-- ORC 테이블의 서데, 인풋 아웃풋 포맷
# Storage Information        
SerDe Library:          org.apache.hadoop.hive.ql.io.orc.OrcSerde    
InputFormat:            org.apache.hadoop.hive.ql.io.orc.OrcInputFormat  
OutputFormat:           org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat    

-- TXT 테이블 생성 
CREATE TABLE txt_tbl (
  col STRING
);

-- TXT 테이블 확인 
hive>desc formatted txt_tbl;

-- TXT 테이블의 서데, 인풋 아웃풋 포맷
-- Storage Information        
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe   
InputFormat:            org.apache.hadoop.mapred.TextInputFormat     
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat   



커스텀 서데

기본적으로 제공하는 서데외에 사용자가 서데를 구현할 수 있다. 원천데이터를 조작하여 테이블의 포맷에 맞는 데이터 형태로 변경해야 할 때 사용할 수 있다. 대부분의 경우 데이터를 읽을 때 포맷을 변환하는 경우가 많기 때문에 doDeserialize()를 구현하는 경우가 많다.



예제


다음은 LazySimpleSerDe를 상속하여 커스텀 서데를 구현한 예제입니다. 아래의 샘플 데이터 처럼 값에 느낌표(!)가 들어가 있습니다. 데이터 입력시에 이를 제거하기 위한 커스텀 서데 입니다.

$ cat sample.txt
david   23!
cole    3!5
anna    !92

LazySimpleSerDe를 상속하고 doDeserialize()를 구현하였습니다.

import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;

public class SampleSerDe extends LazySimpleSerDe {

    public SampleSerDe() throws SerDeException {
        super();
    }

    @Override
    public Object doDeserialize(Writable field) throws SerDeException {
                // 느낌표는 제거  
        String temp = field.toString().replaceAll("!", "");
        return super.doDeserialize(new Text(temp));
    }
}



사용 방법


커스텀 서데를 사용하기 위해서는 우선 구현한 클래스를 jar 파일로 묶어서 ADD JAR 명령을 이용해 추가하고 테이블 생성시에 설정값을 추가해 준다. 이후 데이터를 조회하면 느낌표가 없는 데이터를 확인할 수 있다.

-- 클래스가 들어 있는 jar 파일 추가 
hive> ADD JAR ./hiveUDF.jar;

-- 테이블 생성 시에 서데 정보 및 프로퍼티 정보 전달 
hive> CREATE TABLE serde_tbl
(
  col1 STRING
  , col2 STRING
) 
ROW FORMAT SERDE 'com.sec.hive.serde.SampleSerDe'
WITH SERDEPROPERTIES ( "field.delim" = "\t" )
;

-- 샘플 데이터를 입력 
hive> LOAD DATA LOCAL INPATH './sample.txt' INTO TABLE serde_tbl;

-- 데이터 조회 
hive> select * from serde_tbl;
OK
david   23
cole    35
anna    92