hive之SerDe


hive之SerDe

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.

Author: halberd.lee

Created: 2020-05-30 Sat 00:17

Validate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM