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会将其视为普通字段。这不是答案,应该是一个注释。