gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:32:06 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com