当我创建一个像
这样的表格时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反序列化包含可选字段的thrift类?
谢谢,
麦克
答案 0 :(得分:0)
你在哪个Thrift版本中编译你的thrift文件?我在Hive 12上,我在0.9.X节省了这个错误。我将我的节俭版本降级到0.7.0,它与Hive 12一起工作正常。
如果您遇到当前的Hive版本,请在生成Thrift Java文件时降级Thrift版本。 Hive中的ThriftDeserializer不会忽略某些字段,因为它应该创建并创建可选的空结构,Hive无法处理。
根据你所使用的Hive版本,检查https://github.com/apache/hive/releases并查看他们用于发布的Thrift版本,并使用Thrift版本将thrift模式编译为java。