实现Hadoop的Writable接口的枚举值

2023-11-25

假设我有一个枚举:

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_2 with ENUM_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();

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现Hadoop的Writable接口的枚举值 的相关文章

随机推荐

  • 如何一次性向 data.frame 添加多列?

    我有以下数据框和向量 ddf data frame a rep 1 10 b rep 2 10 xx c c d e f 如何向数据框中添加以 xx 中的项目命名的新空列 我尝试了以下操作 但它不起作用 ddf cbind ddf data
  • 使用 CSS 包含自定义字体以使其与大多数浏览器兼容的最佳方法是什么?

    我尝试了各种代码来嵌入自定义字体 最后以下似乎可以在上面的 FF 和 IE8 中工作 但IE7不支持 font face font family xyzfont src url fonts abc font eot format eot u
  • 如何获取 Django 中的所有请求标头?

    我需要获取所有 Django 请求标头 根据我的阅读 Django 只是将所有内容转储到request META变量以及许多其他数据 最好的方法是什么all客户端发送到我的 Django 应用程序的标头 我将用这些来构建一个httplib要
  • Linux 上的 PYTHONPATH [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我是这方面的新手 我已经开始学习Python 但我有一些无法理解的问题 PYTHONPATH 在 Ubuntu 上 到底是什么 它是一个文件夹吗 Python 是 Ubuntu
  • Maven和Ant插件智能复制资源

    很容易使用org apache maven plugins maven antrun plugin复制资源并重命名它们 但有没有一种方法可以使用通配符或其他机制来智能地执行此操作以符合个人规则 例如 如果我有这些文件 project art
  • 如何使用静态方法作为策略设计模式的默认参数?

    我想创建一个使用与此类似的策略设计模式的类 class C staticmethod def default concrete strategy print default staticmethod def other concrete s
  • 如何通过 VirtualBox 运行 Windows 8 Phone 模拟器?

    首先 我不确定我的计算机是否可以处理 VirtualBox 和 Windows 8 手机模拟器 因为没有运行模拟器的按钮 运行 Windows Phone 8 和 VirtualBox 模拟器是否有特定要求 从已安装的 Windows Ph
  • 在 mutate_at 中使用 case_when

    我想用case when within mutate at 如下例所示 mtcars gt mutate at vars vars vs am funs funs case when in c 1 0 9 TRUE in c 2 20 20
  • 正则表达式匹配单个新行。正则表达式匹配双新行

    我正在尝试构建一个正则表达式来匹配一个单独的换行符 n 同样 我需要另一个正则表达式来匹配双换行符 n n 不属于较长的换行符 例如 n n n or n n n n n n etc n n and n n n 匹配太多 它们匹配较长换行符
  • 使用 Linq to GroupBy 和 Sum 数据表

    你好 我有一个这样的数据表 Id Amount 1 Amount 2 Amount 3 1 2 2 2 12 4 6 4 12 6 6 5 22 7 2 1 22 7 2 2 我需要像这样获取我的数据表 Id
  • 使用 CSS font-family 选择不适用于 Android 的 Droid 字体

    我发现以下 HTML 代码在 Android 上不起作用 它只会使用默认字体 Droid Sans 在桌面上它可以按预期工作 p style font family none v nd whisky i tequila pre fix p
  • 使用/ jQuery 滚动到特定元素

    我有一个很长的嵌套 div 列表 我在查询字符串上传递特定元素 实际上是段落元素 的 ID 并打开其 div 和父级 onload 但是 列表太长 有时打开的元素隐藏在窗口底部下方 如何自动滚动用户的浏览器窗口以使显示的元素位于屏幕顶部 您
  • JavaScript 中的有效属性名称、属性分配和访问

    更新的问题 到底什么才是 Javascript 中有效的属性名称 各种财产分配方式有何不同 属性名称如何影响属性访问 Note 我最初问题的答案 见下文 有助于澄清一些事情 但也带来了新的麻烦 现在我有机会更加熟悉 JavaScript 我
  • 如何备份和恢复 Delphi 设置? [复制]

    这个问题在这里已经有答案了 可能的重复 如何迁移 Delphi 或克隆 Delphi 注册表设置 我很快需要格式化我的电脑 但我已经按照我想要的方式完美设置了 IDE 和环境设置 以及我安装的一些组件 显然 格式化并重新安装 Windows
  • ASP.NET MVC 中控制器的内置基类:Controller 还是 ControllerBase?

    ASP NET MVC 中控制器的内置基类是什么 System Web Mvc Controller 还是 System Web Mvc ControllerBase 在谷歌搜索后我不清楚 On ASP NET 控制器是从 System W
  • asp.net core mvc 密码验证器

    在asp net core MVC中自定义密码验证规则的简单方法是什么 这个问题就像有人在这里遇到的一样如何更改 ASP Net MVC Identity 2 中的密码验证 唯一的区别是我正在使用asp net核心MVC 最新版本 使用 V
  • 交互式输入标题,并使用捕获在其下放置条目

    使用如下所示的捕获模板 我可以将条目添加到文件中的不同标题中 如何在捕获期间手动输入标题 而不是像我现在所做的那样将每个标题设置为 emacs 文件中的一个键 setq org capture templates l Log entry f
  • 有没有办法将 matplotlib 图旋转 45 度?

    我正在寻找一种方法 将 matplotlib pyplot Python 库 中生成的绘图旋转 45 度 例如 这样您就可以得到菱形而不是正方形 有人知道这是否可以做到吗 我能想到的一种方法是对所有数据使用旋转过滤器 使其看起来旋转 但绘图
  • 列表视图中的单选按钮

    我在列表视图格式中显示刺痛列表 我使用默认列表视图并使用放置了一个单选按钮simple list item single choice 但这在右侧显示了单选按钮 我想在左侧显示单选按钮 是否可以使用默认列表视图在左侧显示单选按钮 simpl
  • 实现Hadoop的Writable接口的枚举值

    假设我有一个枚举 public enum SomeEnumType implements Writable A 0 B 1 private int value private SomeEnumType int value this valu