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*)

《HIVE Row Formats和SerDe》

    原文作者:尼小摩
    原文地址: https://www.jianshu.com/p/ea569e499019
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞