hadoop - 在 Hadoop 中编写自定义分区程序的语法

标签 hadoop mapreduce

我了解自定义分区程序背后的想法。就我而言,我想将所有相同的单词发送到一个 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/

相关文章:

eclipse - 安装 Hadoop 的 Eclipse 插件

eclipse 中的 java.lang.NoSuchFieldError : IBM_JAVA error while running hadoop 2. 2.0

hadoop - 即使我设置了 setMapOutputKey 类,但 map 中的键类型不匹配

hadoop - 是否可以将map-reduce的输出直接输出到多个Map文件?

java - 程序hadoop编译时访问报错

hadoop - 配置单元执行错误

hadoop - Hadoop中每个节点的最大容器数意味着什么?

json - 在配置单元数据类型中, map 比 JSON 字符串快多少?

hadoop - HDFS 复制因子 - 最小化数据丢失风险

hadoop - pig : Failed to parse: mismatched input 'id' expecting set null