1

我目前正在使用 4.4 版的大象鸟猪库。如果我尝试从一个 thrift 对象创建一个元组,我希望未在对象中设置的字段在元组中被标记为 null。然而,默认值被放入元组中。例如

struct PropValueUnion {
    1: optional i32 intValue,
    2: optional i64 longValue,
    3: optional string stringValue,
    4: optional double doubleValue,
    5: optional bool flag
} 

以下的输出应该是 (null,null,abc,null,null)

PropValueUnion value = new PropValueUnion();
a.setStringValue("abc");
System.out.println(ThriftToPig.newInstance(PropvalueUnion.class).getPigTuple(value));

实际:(0,0,abc,0.0,0)

问题是字段的 isset 信息在转换为元组期间丢失。是故意做的吗?这个问题有什么解决方法吗?

4

1 回答 1

1

我希望未在对象中设置的字段在元组中标记为空。然而,默认值被放入元组中。乙

这是正确的。isset可以通过检查标志来检测是否设置了可选字段。

public class PropValueUnion implements org.apache.thrift.TBase<PropValueUnion, PropValueUnion._Fields>, java.io.Serializable, Cloneable, Comparable<PropValueUnion> {

  // ... lots of other code omitted ...

  // isset id assignments
  private static final int __INTVALUE_ISSET_ID = 0;
  private static final int __LONGVALUE_ISSET_ID = 1;
  private static final int __DOUBLEVALUE_ISSET_ID = 2;
  private static final int __FLAG_ISSET_ID = 3;
  private byte __isset_bitfield = 0;

  // ... lots of other code omitted ...

  /** Returns true if field doubleValue is set (has been assigned a value) and false otherwise */
  public boolean isSetDoubleValue() {
    return EncodingUtils.testBit(__isset_bitfield, __DOUBLEVALUE_ISSET_ID);
  }

  public void setDoubleValueIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __DOUBLEVALUE_ISSET_ID, value);
  }

  // ... even more code omitted ...

}
于 2014-01-30T19:38:28.587 回答