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
當是讀取hdfs文件時key部分將會被忽略,在寫入hdfs時key總是一個常量,一般的行的數據是存儲在value中的。
用戶在建表的時候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會使用自帶的 SerDe。
你可以創建表時使用用戶自定義的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有深入的了解,看源碼。
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*)