美文网首页
HIVE Row Formats和SerDe

HIVE Row Formats和SerDe

作者: 尼小摩 | 来源:发表于2018-07-31 10:55 被阅读466次

    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.haomeiwen.com/subject/expcvftx.html