在Hive中,“Stored as InputFormat, OutputFormat”和“Stored as”的区别是什么?

14

如果表格是ORC,在执行show create table然后执行结果中的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’

但如果使用这些子句创建表格,则在选择时会出现转换错误。错误信息如下:

Failed with exception java.io.IOException:java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct cannot be cast to org.apache.hadoop.io.BinaryComparable


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

但是,正如类似问题的答案所述: Hive中'InputFormat、OutputFormat'和'Stored as'有什么区别?

我无法理解原因。


1
据我所知,“STORED AS ORC”与“STORED AS INPUTFORMAT 'org.apache.hive.ql.io.orc.OrcInputFormat'”完全相同。这只是指定输入和输出格式的完全限定类的简写方式。 - Andrew
2个回答

10

STORED AS意味着三件事:

  1. SERDE
  2. INPUTFORMAT
  3. OUTPUTFORMAT

你只定义了最后2个,并将SERDE定义为hive.default.serde

hive.default.serde
默认值:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Hive 0.14与HIVE-5976一起添加
Hive用于存储格式未指定SerDe的默认SerDe。
当前未指定SerDe的存储格式包括'TextFile,RcFile'。

演示

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

存储格式为 INPUTFORMAT ... 输出格式为 OUTPUTFORMAT ...

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

3
创建表时,您可以在“STORED AS”中指定“INPUTFORMAT”、“OUTPUTFORMAT”和“SERDE”。Hive 允许您将记录格式与文件格式分开。您可以为 “INPUTFORMAT”、“OUTPUTFORMAT” 和 “SERDE” 提供自定义类。详情请参见:http://www.dummies.com/programming/big-data/hadoop/defining-table-record-formats-in-hive/ 或者,您也可以简单地写成 “STORED AS ORC” 或 “STORED AS TEXTFILE”。例如,“STORED AS ORC” 语句已经处理了 “INPUTFORMAT”、“OUTPUTFORMAT” 和 “SERDE”,这样就不需要编写那些冗长的、全限定的 Java 类名来指定 “INPUTFORMAT”、“OUTPUTFORMAT” 和 “SERDE” 了,只需要用 “STORED AS ORC” 即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接