1 분 소요

 안녕하세요 마개입니다.
 Apache Hive를 이용하다보면 SerDe를 접하게 되는데 이에 대해 알아봅니다.


Hive



SerDe

 SerDeSerializer (직렬화)Deserializer (역직렬화)를 합쳐놓은 형태로 Hive가 데이터를 해석하고 처리하는 방법을 말합니다. 파일을 읽을 때 미리 정해놓은 파일 포맷과 Serializer, Deserializer를 이용해서 데이터를 읽고 쓴다는 것이죠. 여기서 Serializer와 Deserializer는 다음과 같은 역할을 합니다.

  • Serializer (직렬화) : Row 데이터를 Key-Value 형태로 변환하여 파일에 저장함.
  • Deserializer (역직렬화) : 파일에서 읽은 데이터를 하이브의 내부 객체로 변환함.

 즉 위의 두 가지를 통해 SerDe 프로세스는 다음과 같이 진행된다는 것이죠.

  • 읽기 과정
    • HDFS (또는 S3) 파일 –> InputFileFormat –> Key-Value –> Deserializer –> Row Object
  • 쓰기 과정
    • Row Object –> Serializer –> Key-Value –> OutputFileFormat –> HDFS (또는 S3) 파일


Hive 기본 SerDe 종류

 Apache Hive에서는 다음의 7가지 기본 SerDe를 제공합니다.

  • Avro, ORC, RegEx, Thrift, Parquet, CSV, JsonSerDe

 위 종류는 테이블 설정할 때 STORED AS 절에 지정된 파일 포맷에 따라 자동으로 선택됩니다. 이 외에 커스텀 SerDe를 직접 작성해서 이용할 수도 있습니다.


SerDe 작성 쿼리

 SerDe 종류에 따라 ROW FORMAT SERDEINPUTFORMAT, OUTPUTFORMAT 작성법을 기록해놓습니다. Avro, ORC, Parquet은 SerDe, Input, Output 포맷이 설정되고 나머지는 기본 LazySimpleSerDe를 따라갑니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- Avro
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'

-- ORC
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

-- Parquet
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'

-- TEXTFILE
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'