• 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" = "	",
         "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

  • 相关阅读:
    Flipping with Physis: Motion Editing for Acrobatics
    Practicle Character Physics For Animators
    html5 files属性
    ASP.NET大文件上传设置。maxRequestLength无效的情况
    elasticsearch
    html用Css来关闭sougou输入框
    模拟form提交
    疯狂的跨域技术
    日志记录用NLog
    备份iis站点信息
  • 原文地址:https://www.cnblogs.com/halberd-lee/p/12990357.html
Copyright © 2020-2023  润新知