实现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接口的枚举值 的相关文章

  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 如何一次性向 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