如何在Hadoop中对自定义可写类型进行排序

问题描述 投票:0回答:1

我有一个自定义类型,其中包含Hadoop本机类型的字段(例如TextIntWritable),需要在随机/排序阶段使用它作为键和排序。有类似的问题,如this onethis one,但它们是关于使用本机类型。如何使用自定义类型获得相同的结果,需要满足哪些要求?

java sorting hadoop mapreduce hadoop2
1个回答
0
投票

实现这一结果有一些细微差别,有些是显而易见的,有些则不然。我将尝试在几个短点内解释它们:

  1. 首先,自定义类型必须实现WritableComparable而不仅仅是Writable,当然,还要定义compareTo()方法。
  2. 来自Hadoop: The Definitive Guide非常重要的说明: 所有Writable实现都必须具有默认构造函数,以便MapReduce框架可以实例化它们,然后通过调用readFields()填充它们的字段。 也许最容易出错的部分是默认构造函数应该实例化那些字段(如果它们没有被初始化),因为它们不能为空。
  3. 如果您对默认排序不满意,这一点是关于创建自定义比较器。在这种情况下,您需要创建一个新类,它扩展WritableComparator并覆盖其compare()方法。在此之后,您有两种使用此比较器而不是默认比较器的方法:或者在Job的setSortComparatorClass方法的帮助下设置此类: job.setSortComparatorClass(YourComparator.class) 或者在自定义类型的静态块中注册它: static { WritableComparator.define(CustomType.class, new YourComparator()); } 静态块注册原始比较器,以便每当MapReduce看到类时,它都知道使用原始比较器作为其默认比较器。

Here是具有静态嵌套比较器的此类的示例。

© www.soinside.com 2019 - 2024. All rights reserved.