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



我理解自定义分区器背后的想法。在我的情况下,我想将所有相同的单词发送到一个减缩器。我知道我可以使用哈希代码来做到这一点。

但是,我不确定Hadoop API中partitioner的语法。

这是签名:

Class Partitioner<KEY,VALUE> 

如何选择键、值类型?为什么我需要这里的值?我不应该只使用键并根据一些逻辑返回一个整数吗(在我的例子中是散列码)。

有人能举例说明吗?

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

公共类HashPartitioner扩展Partitioner{public int getPartition(K键,V值,int numReduceTasks){return(key.hashCode()&Integer.MAX_VALUE)%numReduceTasks;}}

键必须是WritableComparable类型,因为框架必须基于键执行排序,并且值可以是任何可写类型,以便框架可以序列化和反序列化它们

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

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

因此,现在在partitioner中,您可以根据值部分中包含的评级来决定将记录发送到哪个reducer,比如如果评级等于1,则返回0,如果2,则返回1,依此类推。所以代码将是一些如何如下

公共类MoviePartitioner扩展Partitioner{@Overridepublic int getPartition(LongWritable userId,电影值,int arg2){int rating=Integer.parseInt(value.getMovieRating());回报率-1;//评级从1开始}}

相关内容

  • 没有找到相关文章

最新更新