在Hive中“存储为输入格式,输出格式”和“存储为”之间的差异

时间:2017-06-08 19:03:52

标签: hadoop hive hiveql orc hive-serde

执行show create table时出现问题,然后在表格为ORC时执行生成的create table语句。

使用show create table,您可以得到:

STORED AS INPUTFORMAT
  ‘org.apache.hadoop.hive.ql.io.orc.OrcInputFormat’
OUTPUTFORMAT
  ‘org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat’

但是如果使用这些子句创建表,则在选择时会出现转换错误。错误喜欢:

  

异常失败   产生java.io.IOException:java.lang.ClassCastException:   org.apache.hadoop.hive.ql.io.orc.OrcStruct无法强制转换为   org.apache.hadoop.io.BinaryComparable


要解决此问题,只需将create table声明更改为STORED AS ORC

但是,正如答案在类似的问题中所说: What is the difference between 'InputFormat, OutputFormat' & 'Stored as' in Hive?

我无法弄清楚原因。

2 个答案:

答案 0 :(得分:8)

STORED AS意味着三件事:

  1. SERDE
  2. INPUTFORMAT
  3. OUTPUTFORMAT
  4. 您只定义了最后2个,而SERDE由 hive.default.serde

    定义
      

    <强> hive.default.serde
       默认值:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
       添加于:Hive 0.14 with HIVE-5976
       默认的SerDe Hive将用于未指定SerDe的存储格式   目前未指定SerDe的存储格式包括&#39; TextFile,RcFile&#39;。

    演示

    <强> hive.default.serde

    set hive.default.serde;
    
    hive.default.serde=org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
    

    以ORC身份存储

    create table mytable (i int) 
    stored as orc;
    
    show create table mytable;
    

    请注意,SERDE为'org.apache.hadoop.hive.ql.io.orc.OrcSerde'

    CREATE TABLE `mytable`(
      `i` int)
    ROW FORMAT SERDE 
      'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
    STORED AS INPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
    OUTPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
    LOCATION
      'file:/home/cloudera/local_db/mytable'
    TBLPROPERTIES (
      'COLUMN_STATS_ACCURATE'='{\"BASIC_STATS\":\"true\"}', 
      'numFiles'='0', 
      'numRows'='0', 
      'rawDataSize'='0', 
      'totalSize'='0', 
      'transient_lastDdlTime'='1496982059')
    

    存储为输入...输出格式......

    create table mytable2 (i int) 
    STORED AS 
    INPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
    OUTPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
    ;
    
    show create table mytable2
    ;
    

    请注意,SERDE为'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

    CREATE TABLE `mytable2`(
      `i` int)
    ROW FORMAT SERDE 
      'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
    STORED AS INPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
    OUTPUTFORMAT 
      'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
    LOCATION
      'file:/home/cloudera/local_db/mytable2'
    TBLPROPERTIES (
      'COLUMN_STATS_ACCURATE'='{\"BASIC_STATS\":\"true\"}', 
      'numFiles'='0', 
      'numRows'='0', 
      'rawDataSize'='0', 
      'totalSize'='0', 
      'transient_lastDdlTime'='1496982426')
    

答案 1 :(得分:3)

创建表格时,您可以在INPUTFORMAT中指定OUTPUTFORMATSERDESTORED AS。 Hive允许您将记录格式与文件格式分开。您可以为INPUTFORMATOUTPUTFORMATSERDE提供自定义类。查看详情:http://www.dummies.com/programming/big-data/hadoop/defining-table-record-formats-in-hive/

或者,您可以简单地编写STORED AS ORCSTORED AS TEXTFILE。     存储为ORC语句已经处理INPUTFORMATOUTPUTFORMATSERDE。这允许您不要为INPUTFORMATOUTPUTFORMATSERDE编写那些长的完全限定的Java类名。只需改为STORED AS ORC