/ / Hiveはオプションの倹約フィールドをデシリアライズしません - ハイブ、倹約

ハイブはオプションの倹約フィールドをデシリアライズしません - ハイブ、倹約

のようなテーブルを作成すると

create table myTable
row format serde "org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer"
with serdeproperties ("serialization.class"="com.myco.MyClass",
"serialization.format"="org.apache.thrift.protocol.TJSONProtocol")
stored as SEQUENCEFILE;

これは、必要なフィールドのような倹約の構造のためにうまく動作します。

struct MyClass {
1:  required i32 foo;
}

オプションのフィールドを持つ構造体

struct MyClass2 {
1:  optional i32 foo;
}

次のエラーを出す

FAILED: SemanticException java.lang.IllegalArgumentException: Error: name expected at the position 11 of "int:struct<>" but ">" is found.

Hiveは NULL 列の値には、オプションの構造の明白なマッピングがあります。

どのようにして、Hiveはオプションのフィールドを含むリザーブクラスをデシリアライズするのですか?

ありがとう、

マイク

回答:

回答№1は0

どの倹約版であなたの倹約ファイルを編集していますか?私はハイブ12で、0.9.Xでの倹約でこの正確なエラーが発生しました。私の節約バージョンを0.7.0にダウングレードし、ハイブ12で正常に動作します。

あなたが現在のHiveバージョンに固執している場合は、Thrift Javaファイルを生成するときにThriftバージョンをダウングレードします。 HiveのThriftDeserializerは、Hiveが処理できない任意の空の構造体を想定して作成するという点で、特定のフィールドを無視しません。

あなたがいるHiveバージョンに基づいて、 https://github.com/apache/hive/releases リリース用に使用したThriftのバージョンを確認し、Thriftのバージョンを使用してJava用のスリルマのスキーマをコンパイルします。