Hive无法反序列化可选的thrift字段

时间:2014-10-27 18:38:04

标签: hive thrift

当我创建一个像

这样的表格时
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类?

谢谢,

麦克

1 个答案:

答案 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。