我有一个自定义类型,其中包含hadoop本机类型的字段(例如。 Text 以及 IntWritable )需要将其用作键,并在shuffle/sort阶段按需要排序。有类似的问题,比如这个和这个,但是它们是关于使用本机类型的。如何实现与自定义类型相同的结果,它需要满足哪些要求?
Text
IntWritable
kuarbcqp1#
实现这一结果有细微差别,有些是显而易见的,有些则不然。我将试着用几个简短的要点来解释它们:首先,自定义类型必须实现writeablecomparable,而不仅仅是writeable和define compareTo() 方法。hadoop非常重要的一点:权威指南:所有可写实现都必须有一个默认构造函数,这样mapreduce框架才能示例化它们,然后通过调用readfields()填充它们的字段。可能最容易出错的部分是默认构造函数应该示例化这些字段(如果它们没有初始化的话),因为它们不能为null。这一点是关于创建一个定制的比较器,如果您对默认排序不满意的话。在这种情况下,您需要创建一个新类,该类扩展writablecomparator并重写其 compare() 方法。在此之后,您有两种方法可以使用这个比较器而不是默认的比较器:或者您可以通过job的setsortcomparatorclass方法来设置这个类:
compareTo()
compare()
job.setSortComparatorClass(YourComparator.class)
或者在自定义类型的静态块中注册它:
static { WritableComparator.define(CustomType.class, new YourComparator()); }
静态块注册原始比较器,这样每当mapreduce看到类时,它就知道使用原始比较器作为其默认比较器。下面是这样一个带有静态嵌套比较器的类的示例。
1条答案
按热度按时间kuarbcqp1#
实现这一结果有细微差别,有些是显而易见的,有些则不然。我将试着用几个简短的要点来解释它们:
首先,自定义类型必须实现writeablecomparable,而不仅仅是writeable和define
compareTo()
方法。hadoop非常重要的一点:权威指南:
所有可写实现都必须有一个默认构造函数,这样mapreduce框架才能示例化它们,然后通过调用readfields()填充它们的字段。
可能最容易出错的部分是默认构造函数应该示例化这些字段(如果它们没有初始化的话),因为它们不能为null。
这一点是关于创建一个定制的比较器,如果您对默认排序不满意的话。在这种情况下,您需要创建一个新类,该类扩展writablecomparator并重写其
compare()
方法。在此之后,您有两种方法可以使用这个比较器而不是默认的比较器:或者您可以通过job的setsortcomparatorclass方法来设置这个类:或者在自定义类型的静态块中注册它:
静态块注册原始比较器,这样每当mapreduce看到类时,它就知道使用原始比较器作为其默认比较器。
下面是这样一个带有静态嵌套比较器的类的示例。