のようなテーブルを作成すると
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用のスリルマのスキーマをコンパイルします。