Hive 配置单元无法反序列化可选的节约字段

Hive 配置单元无法反序列化可选的节约字段,hive,thrift,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")

当我创建一个像

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;
}
但是具有可选字段的结构,如

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反序列化包含可选字段的节俭类

谢谢


迈克

你用哪个旧版本编译你的旧版本文件?我在12号蜂箱上,我在0.9.X版上的节俭有一个准确的错误。我把我的旧版本降到了0.7.0,它在Hive12上运行良好

如果您仍使用当前配置单元版本,请在生成Thrift Java文件时降级Thrift版本。配置单元中的ThriftDeserializer不会忽略某些字段,因为它应该忽略这些字段,并创建可选的空结构,而配置单元无法处理这些空结构


根据您所在的配置单元版本,检查并查看他们在发布时使用的旧版本,并使用该旧版本将您的旧模式编译为java。

在将SemanticException java.lang.IllegalArgumentException:Error:name预期在google中之后,我遇到了许多类似的问题。这似乎是一个蜂巢问题。你看过邮报了吗?谢谢,詹斯。这种错误似乎发生在各种情况下。你知道是什么触发了它吗?这是一个蜂巢bug,当你使用更高的节俭版本(如0.9)生成节俭java文件时,它会生成一个名为optionals的非静态私有字段,它不会被忽略,ObjectInspector会将其视为普通字段。这不是答案,应该是一个注释。