java.io.ioexception:org.apache.thrift.protocol.tprotocolexception:无法编写没有设置值的tunion

sxpgvts3  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(384)

我正在使用thrift方案将thrift包作为桶文件存储在hadoop集群中。一切似乎都正常。正在创建节俭包,没有任何错误。
虽然,我使用kafka发送包,序列化时,serializer函数将包转换为字节数组。为什么Kafka要查看bundle对象以将其转换为字节数组。或者有什么方法可以让我安全地将任何对象转换为字节数组。如果有,请提供它。错误是:

java.io.IOException: org.apache.thrift.protocol.TProtocolException: Cannot write a TUnion with no set value!

下面是引发错误的writeobject函数

private void writeObject(java.io.ObjectOutputStream out)
        throws java.io.IOException {
    try {
        write(new org.apache.thrift.protocol.TCompactProtocol(
                new org.apache.thrift.transport.TIOStreamTransport(out)));
    } catch (org.apache.thrift.TException te) {
        throw new java.io.IOException(te);
    }
}
trnvg8h3

trnvg8h31#

信息很清楚:有一个地方 union 未设置值的对象。必须为节俭工会设置一个值。
节俭联盟示例,请参见*.thrift文件:

union Foo {
  1: string bar
  2: bool baz
}

这是引发错误的条件:

public void write(TProtocol oprot, TUnion struct) throws TException {
  if (struct.getSetField() == null || struct.getFieldValue() == null) {
    throw new TProtocolException("Cannot write a TUnion with no set value!");
  }

  // ... more code ...
}

无法从给定的代码中判断它是什么对象,因为堆栈太深。看看调用 writeObject() ,然后向上走。在代码中的某个地方,某些数据没有按其应有的方式设置,或者该值被设置为 null 价值-这是非法的节俭。如果你真的需要一个指标 null 在您的用例中,考虑一个额外的布尔标志。

相关问题