web-dev-qa-db-ja.com

Hiveの「InputFormat、OutputFormatとして保存」と「として保存」の違い

テーブルが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’

ただし、これらの句を使用してテーブルを作成すると、選択時にキャストエラーが発生します。エラーが好き:

例外Java.io.IOException:Java.lang.ClassCastExceptionで失敗しました:org.Apache.hadoop.Hive.ql.io.orc.OrcStructをorg.Apache.hadoop.io.BinaryComparableにキャストできません


これを修正するには、create tableステートメントをSTORED AS ORCに変更するだけです。

しかし、同様の質問で答えが言ったように: Hiveの「InputFormat、OutputFormat」と「Storedas」の違いは何ですか?

理由がわかりません。

10
Jason

STORED ASは、次の3つのことを意味します。

  1. SERDE
  2. INPUTFORMAT
  3. 出力フォーマット

最後の2つだけを定義し、SERDEはHive.default.serdeで定義されます。

Hive.default.serde
デフォルト値:org.Apache.hadoop.Hive.serde2.lazy.LazySimpleSerDe
追加:Hive0.14とHive-5976
デフォルトのSerDeHiveは、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')

テーブルを作成するときに、STORED ASINPUTFORMATOUTPUTFORMATSERDEを指定できます。 Hiveを使用すると、レコード形式をファイル形式から分離できます。 INPUTFORMATOUTPUTFORMATSERDEのカスタムクラスを提供できます。詳細を参照してください: http://www.dummies.com/programming/big-data/hadoop/defining-table-record-formats-in-Hive/

または、たとえばSTORED AS ORCまたはSTORED AS TEXTFILEと書くこともできます。 STORED AS ORCステートメントは、すでにINPUTFORMATOUTPUTFORMAT、およびSERDEを処理します。これにより、完全修飾された長いJava INPUTFORMATOUTPUTFORMATSERDEのクラス名を記述しないでください。STORED AS ORCだけです。代わりに。

3
leftjoin