gpt4 book ai didi

java - 枚举值实现Hadoop的Writable接口(interface)

转载 作者:可可西里 更新时间:2023-11-01 14:19:14 25 4
gpt4 key购买 nike

假设我有一个枚举:

public enum SomeEnumType implements Writable {
A(0), B(1);

private int value;

private SomeEnumType(int value) {
this.value = value;
}

@Override
public void write(final DataOutput dataOutput) throws IOException {
dataOutput.writeInt(this.value);
}

@Override
public void readFields(final DataInput dataInput) throws IOException {
this.value = dataInput.readInt();
}
}

我想将它的一个实例作为其他类实例的一部分传递。

equals 是行不通的,因为它不会考虑枚举的内部变量,而且所有枚举实例在编译时都是固定的,无法在其他地方创建。

这是否意味着我无法在 Hadoop 中通过线路发送枚举或者有解决方案?

最佳答案

对于 Hadoop 中的枚举,我通常和首选的解决方案是通过它们的序数值序列化枚举。

public class EnumWritable implements Writable {

static enum EnumName {
ENUM_1, ENUM_2, ENUM_3
}

private int enumOrdinal;

// never forget your default constructor in Hadoop Writables
public EnumWritable() {
}

public EnumWritable(Enum<?> arbitraryEnum) {
this.enumOrdinal = arbitraryEnum.ordinal();
}

public int getEnumOrdinal() {
return enumOrdinal;
}

@Override
public void readFields(DataInput in) throws IOException {
enumOrdinal = in.readInt();
}

@Override
public void write(DataOutput out) throws IOException {
out.writeInt(enumOrdinal);
}

public static void main(String[] args) {
// use it like this:
EnumWritable enumWritable = new EnumWritable(EnumName.ENUM_1);
// let Hadoop do the write and read stuff
EnumName yourDeserializedEnum = EnumName.values()[enumWritable.getEnumOrdinal()];
}

}

显然它有缺点:序数可以更改,因此如果您将 ENUM_2ENUM_3 交换并读取先前序列化的文件,这将返回另一个错误的枚举。

所以如果你事先知道枚举类,你可以写下你的枚举的名称并像这样使用它:

 enumInstance = EnumName.valueOf(in.readUTF());

这将使用更多空间,但更节省对枚举名称的更改。

完整的示例如下所示:

public class EnumWritable implements Writable {

static enum EnumName {
ENUM_1, ENUM_2, ENUM_3
}

private EnumName enumInstance;

// never forget your default constructor in Hadoop Writables
public EnumWritable() {
}

public EnumWritable(EnumName e) {
this.enumInstance = e;
}

public EnumName getEnum() {
return enumInstance;
}

@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(enumInstance.name());
}

@Override
public void readFields(DataInput in) throws IOException {
enumInstance = EnumName.valueOf(in.readUTF());
}

public static void main(String[] args) {
// use it like this:
EnumWritable enumWritable = new EnumWritable(EnumName.ENUM_1);
// let Hadoop do the write and read stuff
EnumName yourDeserializedEnum = enumWritable.getEnum();

}

}

关于java - 枚举值实现Hadoop的Writable接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com