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