zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    git拉取线上新分支拉不下来
    contenteditable属性,让div也可编辑
    给2021做一个小结
    http协议相关面试题
    C# 相对路径 系统路径
    开源数据库全接触-MongoDB,Cassandra,Hypertable,CouchDB,Redis,HBase,Voldemort 等简介
    WebForms,MVC和网页的OAuth / OpenID的支持
    HTTP head 详解
    CAB 文件注册及内部INF 文件说明
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) I Lucky Division】
  • 原文地址:https://www.cnblogs.com/halberd-lee/p/12990357.html
Copyright © 2011-2022 走看看