Java 未设置可选字段时,大象鸟库生成字段的默认值,而不是null
我目前正在使用大象鸟猪库的4.4版。如果我试图从一个thrift对象生成一个元组,我希望没有在对象中设置的字段在元组中被标记为null。但是,默认值被放入元组中。例如Java 未设置可选字段时,大象鸟库生成字段的默认值,而不是null,java,apache-pig,thrift,elephantbird,Java,Apache Pig,Thrift,Elephantbird,我目前正在使用大象鸟猪库的4.4版。如果我试图从一个thrift对象生成一个元组,我希望没有在对象中设置的字段在元组中被标记为null。但是,默认值被放入元组中。例如 struct PropValueUnion { 1: optional i32 intValue, 2: optional i64 longValue, 3: optional string stringValue, 4: optional double doubleValue, 5: op
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)
实际值:(0,0,abc,0.0,0)
问题是字段的isset信息在转换为元组的过程中丢失。这是故意的吗?这个问题有解决办法吗
我希望未在对象中设置的字段在元组中标记为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 ...
}
公共类PropValueUnion实现org.apache.thrift.TBase、java.io.Serializable、Cloneable、Comparable{
//…省略了许多其他代码。。。
//isset id分配
私有静态final int uu INTVALUE_ISSET_ID=0;
私有静态final int u_LONGVALUE _ISSET_ID=1;
私有静态final int uu DOUBLEVALUE _ISSET_ID=2;
私有静态最终int uu标志u ISSET u ID=3;
专用字节uu isset_位字段=0;
//…省略了许多其他代码。。。
/**如果设置了字段doubleValue(已指定值),则返回true,否则返回false*/
公共布尔值isSetDoubleValue(){
返回EncodingUtils.testBit(uuu isset_位字段,uu DOUBLEVALUE_isset_ID);
}
public void setDoubleValueIsSet(布尔值){
__isset\u bitfield=EncodingUtils.setBit(uu isset\u bitfield,uu DOUBLEVALUE\u isset\u ID,value);
}
//…省略了更多的代码。。。
}
elephant bird是一个JAVA库。这个问题涉及到这个库以及该库如何从pig元组转换到thrift对象,反之亦然,而不是一般意义上的thrift语义。我现在删除了C#部分,以减少您的混淆。您的问题是关于Thriftstruct
s中optional
字段的行为。
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 ...
}