hive之SerDe
Table of Contents
1 什么是SerDe
SerDe 是兩個單詞的拼寫 serialized(序列化) 和 deserialized(反序列化)。 什么是序列化和反序列化呢?
當進程在進行遠程通信時,彼此可以發送各種類型的數據,無論是什么類型的數據都會以 二進制序列的形式在網絡上傳送。發送方需要把對象轉化為字節序列才可在網絡上傳輸, 稱為對象序列化;接收方則需要把字節序列恢復為對象,稱為對象的反序列化。
Hive的反序列化是對key/value反序列化成hive table的每個列的值。Hive可以方便 的將數據加載到表中而不需要對數據進行轉換,這樣在處理海量數據時可以節省大量的時間。
在讀寫行數據時,流程如下:
- 讀 HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object - 寫 Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files
當向hdfs寫數據的時候,先經過序列化,將數據轉化成字節序列,然后以指定的格式(outputformat) 輸出到hdfs. 而從hdfs讀數據時,則是一個相反的過程。
2 序列化方式
hive 中內置了多種序列化方式。同時也支持自定義。這里只說明幾種內置的序列化方式:
對於JSON文件,在Hive 0.12.0中添加了JsonSerDe。Amazon SerDe可以在s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar中獲得,用於0.12.0之前的版本。 在Hive 0.9.1中添加了Avro SerDe。 從Hive 0.14.0開始,其規范隱含在STORED AS AVRO子句中。 在Hive 0.11.0中添加了ORC文件格式的SerDe。 Parive的SerDe通過Hive 0.10中的插件添加,並在Hive 0.13.0中原生添加。 在Hive 0.14中添加了支持 CSV 的SerDe。
SerDe 類型 | 是否內 | 庫 | 說明 | 支持版本 |
---|---|---|---|---|
LazySimpleSerDe | 內置 | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | 用來處理文本文件格式:TEXTFILE ,默認的處理方式。 | |
ColumnarSerDe | 內置 | org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe | 處理RCFile | |
RegexSerDe | 內置 | org.apache.hadoop.hive.serde2.RegexSerDe | 用來處理文本文件的內置 JAVA 正則表達式 SerDe | |
HBaseSerDe | 內置 | 允許 Hive 跟 HBase 進行集成。我們可以利用 HBaseSerDe 來將 Hive 表存儲到 HBase 中 | ||
AvroSerDe | 內置 | 在 Hive 表中讀寫 Avro 數據格式的數據。 | 0.9.1 | |
參考http://avro.apache.org/ | ||||
ParquetHiveSerDe | 內置 | org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe | 在 Hive 中讀寫 Parquet 數據格式的數據 | 0.13 |
OpenCSVSerDe | 內置 | org.apache.hadoop.hive.serde2.OpenCSVSerde | 讀寫CSV數據,源碼:https://github.com/ogrodnek/csv-serde | 0.14 |
JSONSerDe | 內置 | org.apache.hadoop.hive.serde2.JsonSerDe | 可以通過Hive 讀取 JSON 數據 | 3.0.0 |
不需要指定庫,CREATE TABLE my_table(…) STORED AS JSONFILE; | 4.0.0 | |||
org.apache.hive.hcatalog.data.JsonSerDe | 可以通過Hive 讀取 JSON 數據 | 0.12 later | ||
ORC | 內置 | org.apache.hadoop.hive.ql.io.orc.OrcSerde | RCFILE 的改良版 | O.11 |
thrift | 內置 | |||
MultiDelimitSerDe | 內置 | org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe | 處理多種分隔符的textfile. |
3 序列化的使用
3.1 建表時指定序列化方式
-
RegexSerDe
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;
-
JsonSerDe
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;
-
CSVSerDe
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;
-
ORCSerDe
create table my_table(a string,b string, ...) stored as orc;
- 其他 我們一般不再使用其他的序列化方式。以上幾種基本滿足日常需求。 MetadataTypedColumnsetSerDe 處理csv類的文件,我們一般使用CSVSserDe.
Created: 2020-05-30 Sat 00:17