elephant-bird库在未设置可选字段时生成字段的默认值,而不是null

des4xlb0  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(384)

我目前正在使用4.4版的象鸟Pig库。如果我试图从一个节俭对象生成一个元组,我希望在这个对象中没有设置的字段在元组中被标记为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,,null,null)

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

实际值:(0,0,,0.0,0)
问题是字段的isset信息在转换为元组的过程中丢失。这是故意的吗?这个问题有解决办法吗?

gxwragnw

gxwragnw1#

我希望没有在对象中设置的字段在tuple中被标记为null。但是,默认值被放入元组中。e
这是正确的。是否设置了可选字段可以通过检查 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 ...

}

相关问题