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

    当是读取hdfs文件时key部分将会被忽略,在写入hdfs时key总是一个常量,一般的行的数据是存储在value中的。

    用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。

    你可以创建表时使用用户自定义的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" = "	",
       "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有深入的了解,看源码。

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

     

  • 相关阅读:
    使用Python快速生成虚拟的超大文件
    常用的 adb 命令合集
    Jmeter 性能测试之反向代理录制性能测试脚本
    论医院网络时钟系统(NTP时钟服务器)的重要性
    北斗时钟装置(卫星时间同步系统)应用自动化系统探讨
    解决前端部署到Nginx非根目录下页面出现空白的问题
    解决docker中Easyexcel因缺少字体无法导出的问题
    看图认识HTML5
    看图知Docker
    ASIS CTF Finals 2020
  • 原文地址:https://www.cnblogs.com/itboys/p/12796300.html
Copyright © 2011-2022 走看看