HIVE Row Formats和SerDe

Serde是 Serializer/Deserializer的簡寫。hive使用Serde進行行對象的序列與反序列化。

What is a SerDe?

SerDe is a short name for "Serializer and Deserializer."
Hive uses SerDe (and FileFormat) to read and write table rows.
HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files

序列化作用

序列化是對象轉換為字節序列的過程。
序列化是字節序列恢復為對象的過程。
對象的序列化主要有兩種用途:對象的持久化,即把對象轉換成字節序列后保存到文件中;對象數據的網絡傳送。
除了上面兩點, hive的序列化的作用還包括:Hive的反序列化是對key/value反序列化成hive table的每個列的值。Hive可以方便的將數據加載到表中而不需要對數據進行轉換,這樣在處理海量數據時可以節省大量的時間。

SerDe說明hive如何去處理一條記錄,包括Serialize/Deserilize兩個功能, Serialize把hive使用的java object轉換成能寫入hdfs的字節序列,或者其他系統能識別的流文件。Deserilize把字符串或者二進制流轉換成hive能識別的java object對象。比如:select語句會用到Serialize對象, 把hdfs數據解析出來;insert語句會使用Deserilize,數據寫入hdfs系統,需要把數據序列化。

當是讀取hdfs文件時key部分將會被忽略,在寫入hdfs時key總是一個常量,一般的行的數據是存儲在value中的。

你可以創建表時使用用戶自定義的Serde或者native Serde如果 ROW FORMAT沒有指定或者指定了 ROW FORMAT DELIMITED就會使用native Serde。hive已經實現了許多自定義的Serde,之前我們在介紹stored時也涉及到:

  • Avro (Hive 0.9.1 and later)
  • ORC (Hive 0.11 and later)
  • RegEx
  • Thrift
  • Parquet (Hive 0.13 and later)
  • CSV (Hive 0.14 and later)
  • JsonSerDe (Hive 0.12 and later)

RegEx

ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES 
(
"input.regex" = "<regex>"
)
STORED AS TEXTFILE;

使用正則來序列化行數據,如下例子:

CREATE TABLE apachelog (
  host STRING,
  identity STRING,
  user STRING,
  time STRING,
  request STRING,
  status STRING,
  size STRING,
  referer STRING,
  agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)
STORED AS TEXTFILE;

json

按照json格式存儲text文件

ROW FORMAT SERDE 
'org.apache.hive.hcatalog.data.JsonSerDe' 
STORED AS TEXTFILE


ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar;

CREATE TABLE my_table(a string, b bigint, ...)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE;

CSV/TSV

按照 CSV / TSV格式來存儲text文件。
ROW FORMAT SERDE
‘org.apache.hadoop.hive.serde2.OpenCSVSerde’
STORED AS TEXTFILE

如下例子創建tsv文件,默認是csv文件的分隔符

CREATE TABLE my_table(a string, b string, ...)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = "\t",
   "quoteChar"     = "'",
   "escapeChar"    = "\\"
)  
STORED AS TEXTFILE;

hive的CSVSerde基于csv-serde實現。

其他Serde

  1. MetadataTypedColumnsetSerDe
    這個SerDe用來讀寫像csv文件那樣的記錄
  2. LazySimpleSerDe
    不指定Serde時,默認使用的Serde。
  3. ThriftSerDe
    讀寫Thrift對象或者文件,Thrift對象的類文件需要提前導入。
  4. DynamicSerDe
    也是用來讀寫Thrift對象或者文件。但是它能夠理解Thrift DDL,因此可以再運行時提供 schema對象。
    若是想對以上serde有深入的了解,看源碼。

最后附上Hive User Meeting August 2009 Facebook對serde的講解。

Serialized format:
    Delimited format (tab, comma, ctrl-a …)
    Thrift Protocols
    ProtocolBuffer*
Deserialized (in-memory) format:
    Java Integer/String/ArrayList/HashMap
    Hadoop Writable classes
    User-defined Java Classes (Thrift, ProtocolBuffer*)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容