Hive 无法反序列化可选的节俭字段
Posted
技术标签:
【中文标题】Hive 无法反序列化可选的节俭字段【英文标题】:Hive fails to deserialize optional thrift fields 【发布时间】:2014-10-27 18:38:03 【问题描述】:当我创建一个像
这样的表时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 类?
谢谢,
迈克
【问题讨论】:
将“SemanticException java.lang.IllegalArgumentException: Error: name expected at”扔进谷歌后,我遇到了许多类似的问题。似乎是 Hive SerDe 问题。你看过this的帖子吗? 谢谢,JensG。该错误似乎发生在非常不同的情况下。你知道是什么触发了它吗? 这是一个 Hive 的 bug,当你使用 0.9 等更高的 thrift 版本生成 thrift java 文件时,它会生成一个名为 "optionals" 的非静态私有字段,它不会被忽略并且将被 ObjectInspector 视为普通字段。 【参考方案1】:您使用哪个 Thrift 版本编译您的 thrift 文件?我在 Hive 12 上,我在 0.9.X 的节俭中遇到了这个确切的错误。我将我的 thrift 版本降级为 0.7.0,它在 Hive 12 上运行良好。
如果您坚持使用当前的 Hive 版本,请在生成 Thrift Java 文件时降级您的 Thrift 版本。 Hive 中的 ThriftDeserializer 不会忽略某些字段,因为它应该忽略并创建 Hive 无法处理的可选空结构。
根据您使用的 Hive 版本,检查 https://github.com/apache/hive/releases 并查看他们用于发布的 Thrift 版本,并使用该 Thrift 版本将您的 thrift 架构编译为 java。
【讨论】:
这不是答案,应该是评论。以上是关于Hive 无法反序列化可选的节俭字段的主要内容,如果未能解决你的问题,请参考以下文章
带有选项字段的 F# 记录在 Asp.Net WebApi 2.x 应用程序中无法正确反序列化
Typescript (Angular) - JSON 模型反序列化