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
- MetadataTypedColumnsetSerDe
這個SerDe用來讀寫像csv文件那樣的記錄 - LazySimpleSerDe
不指定Serde時,默認使用的Serde。 - ThriftSerDe
讀寫Thrift對象或者文件,Thrift對象的類文件需要提前導入。 - 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*)