执行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?。
我无法弄清楚原因。
答案 0 :(得分:8)
STORED AS
意味着三件事:
您只定义了最后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
中指定OUTPUTFORMAT
,SERDE
,STORED AS
。 Hive允许您将记录格式与文件格式分开。您可以为INPUTFORMAT
,OUTPUTFORMAT
,SERDE
提供自定义类。查看详情:http://www.dummies.com/programming/big-data/hadoop/defining-table-record-formats-in-hive/
或者,您可以简单地编写STORED AS ORC
或STORED AS TEXTFILE
。
存储为ORC语句已经处理INPUTFORMAT
,OUTPUTFORMAT
和SERDE
。这允许您不要为INPUTFORMAT
,OUTPUTFORMAT
,SERDE
编写那些长的完全限定的Java类名。只需改为STORED AS ORC
。