12

如果表是 ORC,则在执行 ashow 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’

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

失败并出现异常 java.io.IOException:java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct 无法转换为 org.apache.hadoop.io.BinaryComparable


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

But,正如类似问题中的答案所述: Hive 中的“InputFormat、OutputFormat”和“Stored as”有什么区别?.

我想不出原因。

4

2 回答 2

9

STORED AS意味着3件事:

  1. SERDE
  2. 输入格式
  3. 输出格式

您只定义了最后 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 的存储格式包括“TextFile, RcFile”。

演示

hive.default.serde

set hive.default.serde;

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

存储为兽人

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')
于 2017-06-09T04:37:36.380 回答
3

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

或者,您可以简单地编写STORED AS ORCSTORED AS TEXTFILE例如编写。STORED AS ORC 语句已经处理了INPUTFORMAT,OUTPUTFORMATSERDE. INPUTFORMAT这允许您不必为、OUTPUTFORMAT、编写那些长的完全限定的 Java 类名SERDE。只是STORED AS ORC相反。

于 2017-06-09T09:47:16.593 回答