我了解自定义分区程序背后的想法。就我而言,我想将所有相同的单词发送到一个 one reducer。我知道我可以使用哈希码来做到这一点。
但是,我不确定 Hadoop API 中分区程序的语法。
这是签名:
Class Partitioner<KEY,VALUE>
如何选择Key、Value类型?另外为什么我需要这里的值(value)?我不应该只使用 key 并根据某种逻辑返回一个整数(在我的例子中是哈希码)。
谁能举个例子解释一下?
最佳答案
默认分区器(HashPartitioner)的语法如下
public class HashPartitioner extends Partitioner { public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; } }
Key 必须是 WritableComparable 类型,因为框架必须根据键进行排序,而值可以是任何 Writable 类型,以便框架可以对其进行序列化和反序列化。
现在,当您询问对值类型的要求时,让我们以 MovieLense 案例研究为例,其中一个名为 ratings.dat 的文件具有
格式的数据
用户 ID::movieID::ratings::时间戳
在此评分中,用户对电影的评分范围为 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 } }
关于hadoop - 在 Hadoop 中编写自定义分区程序的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924059/