我理解自定义分区程序背后的想法。在我的情况下,我想将所有相同的单词发送到一个reducer。我知道我可以使用哈希码来做到这一点。
但是,我不确定Hadoop API中分区器的语法。
这是签名:
Class Partitioner<KEY,VALUE>
如何选择Key,Value类型?另外为什么我需要这里的价值?我不应该只使用密钥并根据某些逻辑返回一个整数(在我的例子中是哈希码)。
有人可以借助一个例子来解释吗?
答案 0 :(得分:2)
默认分区程序(HashPartitioner)的语法如下所示
public class HashPartitioner extends Partitioner { public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } }
Key必须是WritableComparable类型,因为框架必须基于key执行排序,value可以是任何Writable类型,以便框架可以序列化和反序列化它们。
现在,当您询问值类型的要求时,让我们举一个MovieLense案例研究的例子,其中一个名为 ratings.dat 的文件具有形式的数据
userID :: movieID :: ratings :: timestamp
在此评级中,用户对电影的评级范围为1-5
现在假设userID是键,其他值是值部分。现在假设您的要求是reducer的输出文件应该代表评级,例如一个文件包含评级1的所有记录,另一个文件包含等级2等等。因此,您的输出将有5个代表评级的文件。
所以现在在分区器中你可以根据评级包含在值部分中来决定发送减速器的记录,如果等级为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 } }