java - 如何在 Hadoop 中对自定义可写类型进行排序
问题描述
我有一个自定义类型,其中包含 Hadoop 本机类型的字段(例如Text
和IntWritable
),并且需要在随机/排序阶段将其用作键和排序。有类似的问题this one和this one,但它们是关于使用本机类型的。如何与自定义类型达到同样的效果,需要满足哪些要求?
解决方案
实现这一结果存在细微差别,有些是显而易见的,有些则不是。我将尝试用几个简短的点来解释它们:
- 首先,自定义类型必须实现WritableComparable而不仅仅是Writable,当然,还要定义
compareTo()
方法。 来自Hadoop 的非常重要的说明:权威指南:
所有 Writable 实现都必须有一个默认构造函数,以便 MapReduce 框架可以实例化它们,然后通过调用 readFields() 填充它们的字段。
也许最容易出错的部分是默认构造函数应该实例化该字段(如果它们未初始化),因为它们不能为空。
如果您对默认排序不满意,这一点是关于创建自定义比较器。在这种情况下,您需要创建一个新类,该类扩展WritableComparator并覆盖其
compare()
方法。在此之后,您有两种方法可以使用此比较器而不是默认方法:或者您将此类设置为在 Job 的setSortComparatorClass方法的帮助下使用:job.setSortComparatorClass(YourComparator.class)
或在您的自定义类型的静态块中注册它:
static { WritableComparator.define(CustomType.class, new YourComparator()); }
静态块注册原始比较器,这样每当 MapReduce 看到该类时,它就知道将原始比较器用作其默认比较器。
这是具有静态嵌套比较器的此类的示例。
推荐阅读
- google-cloud-platform - 如何在 Stackdriver 上获取 Spike Alert?
- electron - 为什么我的电子应用程序不能在任何窗口中运行?失败必须有一个合乎逻辑的解释
- sql - 如何加入一个表两次
- javascript - elasticsearch如何正确找到转义字符或保留字符?
- php - 在没有“git”命令的情况下获取 git 提交详细信息
- css - 将鼠标悬停在一个链接上时更改多个链接的颜色
- xcode - 与同级的 .sks 物理体碰撞
- laravel - 在创建函数中找不到 Laravel 页面
- r - 使用点 shapefile 将更精细的栅格数据聚合到 25 公里网格
- windows - 会话结束后是否保存 CMD 历史记录?