在Hadoop中编写自定义分区器的语法

在Hadoop中编写自定义分区器的语法,hadoop,mapreduce,Hadoop,Mapreduce,我理解定制分区器背后的想法。在我的情况下,我想把所有相同的单词发送给一个减速机。我知道我可以使用hashcode来实现这一点 但是,我不确定Hadoop API中分区器的语法 签名如下: Class Partitioner<KEY,VALUE> 类分区器 如何选择键、值类型?为什么我需要这里的值?难道我不应该仅仅使用这个键并根据某种逻辑返回一个整数(在我的例子中是hashcode)吗 有人能举例说明吗?默认分区器(HashPartitioner)的语法如下所示 public c

我理解定制分区器背后的想法。在我的情况下,我想把所有相同的单词发送给一个减速机。我知道我可以使用hashcode来实现这一点

但是,我不确定Hadoop API中分区器的语法

签名如下:

Class Partitioner<KEY,VALUE> 
类分区器
如何选择键、值类型?为什么我需要这里的值?难道我不应该仅仅使用这个键并根据某种逻辑返回一个整数(在我的例子中是hashcode)吗


有人能举例说明吗?

默认分区器(HashPartitioner)的语法如下所示

public class HashPartitioner extends Partitioner { public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } } 公共类HashPartitioner扩展了Partitioner{ 公共int getPartition(K键、V值、int numReduceTasks){ 返回(key.hashCode()&Integer.MAX_值)%numReduceTasks; } } 键必须是可写可比类型,因为框架必须基于键执行排序,而值可以是任何可写类型,以便框架可以序列化和反序列化它们。

现在,当您询问对值类型的要求时,让我们以MovieSense案例研究为例,其中一个名为ratings.dat的文件的数据格式为

userID::movieID::ratings::timestamp
在此分级中,用户对电影的分级范围为1-5级
现在假设userID是键,其他的都在值部分。现在假设您的需求是reducer的输出文件应该表示等级,就像一个文件包含等级1的所有记录,另一个文件包含等级2的所有记录,依此类推。因此,您的输出将总共有5个代表评级的文件。

因此,现在在partitioner中,您可以根据值部分中包含的额定值来决定将记录发送到哪个减速机,例如,如果额定值等于1,则返回0,如果为2,则返回1,依此类推。 因此,代码将如下所示

public class MoviePartitioner extends Partitioner{ @Override public int getPartition(LongWritable userId, Movie value, int arg2) { int rating = Integer.parseInt(value.getMovieRating()); return rating - 1; // as rating starts from 1 } } 公共类电影分割器扩展分割器{ @凌驾 public int getPartition(LongWritable用户标识、电影值、int arg2){ int rating=Integer.parseInt(value.getMovieRating()); 返回评级-1;//评级从1开始 } }