`
Belinda407
  • 浏览: 34241 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

通过复合key借助hadoop自身的排序实现secondary排序

 
阅读更多

问题描述:数据结构<任务id,资源类型,发布日期,词,频度>

已经按 任务id,资源类型,发布日期,词 汇总了频度信息,现在需要以<任务id,资源类型,发布日期>为分组,组内按频度倒排,提取前200条记录

 

参考hadoop自带示例中的org.apache.hadoop.examples.SecondarySort实现

复合key: WordFreq<TagHead,词,频度>,其中TagHead表达group,即<任务id,资源类型,发布日期>

1.在WordFreq中通过Override compareTo实现组内按频度倒排

@Override

public int compareTo(WordFreq other) {

return ComparisonChain.start()

.compare(this.getGroup(), other.getGroup())

.compare(other.count, this.count)

.compare(this.tag.getWord(), other.tag.getWord()).result();

}

2.在TagHead中Override如下3项

@Override

public int compareTo(TagHead other) {

return ComparisonChain.start().compare(this.tagsid, other.tagsid)

.compare(this.sourceType, other.sourceType)

.compare(this.releaseDateDay, other.releaseDateDay).result();

}

 

@Override

public boolean equals(Object o) {

if (o instanceof TagHead) {

TagHead other = (TagHead) o;

return this.tagsid.equals(other.tagsid)

&& this.sourceType.equals(other.sourceType)

&& this.releaseDateDay.equals(other.releaseDateDay);

}

return false;

}

 

@Override

public int hashCode() {

int hash = (this.tagsid != null ? Integer.parseInt(this.tagsid) : 0);

hash += (this.sourceType != null ? Integer.parseInt(this.sourceType) * 13

: 0);

hash += (this.releaseDateDay != null ? Integer

.parseInt(this.releaseDateDay.replace("-", "")) * 7 : 0);

return hash;

 

}

 

3.简单项:SimpleWordFreq<词,频度>

4.

public class SubSortingWordFreqMapper extends

 

Mapper<LongWritable, Text, WordFreq, SimpleWordFreq>{

...

}

 

public static class SubSortingWordFreqReducer extends

Reducer<WordFreq, SimpleWordFreq, Text, NullWritable> {

@Override

protected void reduce(WordFreq key, Iterable<SimpleWordFreq> values,

Context context) throws IOException, InterruptedException {

for (SimpleWordFreq value : values) {

...

}

 

}

}

5.自定义Partitioner,计算nature key即group的哈希值

public class TagCloudPartitioner extends Partitioner<WordFreq, SimpleWordFreq> {

private static Logger log = LoggerFactory

.getLogger(TagCloudPartitioner.class);

 

@Override

public int getPartition(WordFreq key, SimpleWordFreq value, int numPartitions) {

int hashCode = key.getGroup().hashCode();

log.debug(key.getGroup().getHead("_") + ";hashCode=" + hashCode);

return hashCode % numPartitions;

}

 

}

 

6.自定义groupComparator

public class TagCloudHeadGroupingComparator extends WritableComparator {

 

protected TagCloudHeadGroupingComparator() {

super(WordFreq.class, true);

}

 

@Override

public int compare(WritableComparable tp1, WritableComparable tp2) {

WordFreq wordFreq = (WordFreq) tp1;

WordFreq wordFreq2 = (WordFreq) tp2;

return wordFreq.compareGroup(wordFreq2);

}

}

7.调用时特殊设置

job.setPartitionerClass(TagCloudPartitioner.class);

job.setGroupingComparatorClass(TagCloudHeadGroupingComparator.class);

分享到:
评论

相关推荐

    hadoop 二次排序 原理

    本文将深入解析Hadoop的二次排序(Secondary Sort)原理,这是一个允许用户自定义排序规则以满足特定需求的功能。 首先,二次排序是在MapReduce框架内进行的一种特殊排序方式,它遵循两个主要步骤:第一字段排序和...

    hadoop分区二次排序示例.zip

    这个示例展示了Hadoop MapReduce在处理复杂排序需求时的灵活性,以及如何通过自定义Partitioner和Comparator实现特定的业务逻辑。对于大型的基站数据或者其他具有类似排序需求的场景,这样的解决方案非常有价值。...

    hadoop 二次排序 插入数据库

    二次排序(Secondary Sort)是Hadoop MapReduce中的一个重要概念,它允许用户自定义数据的最终排序方式,以满足更复杂的排序需求。这篇博客文章(虽然链接无法直接访问,但我们可以根据常规知识来解释这个概念)可能...

    hadoop排序和google三大论文

    标题中的“Hadoop排序”指的是Hadoop框架中的MapReduce排序机制。MapReduce是Apache Hadoop的核心组件,主要用于处理和生成大规模数据集。在Hadoop中,数据被分割成多个块,然后并行处理,其中排序是一个关键步骤,...

    Hadoop大数据期末考试重点

    21. **Mapper类**:Hadoop提供的Mapper类是实现Map阶段逻辑的基础类。 以上是对Hadoop大数据期末考试重点内容的详细解读,涵盖了Hadoop的分布式文件系统HDFS、MapReduce计算模型以及相关配置和操作细节,考生需要对...

    Hadoop MapReduce实现tfidf源码

    总结来说,通过Hadoop MapReduce实现TF-IDF,我们可以高效地处理大规模文本数据,计算每个词在每个文档中的重要性,这对于信息检索、文本分类、主题模型等应用具有重要意义。实际操作中,需要编写Java代码,理解和...

    Hadoop平台技术 排序操作案例.docx

    总结来说,Hadoop的排序机制是通过MapTask和ReduceTask的组合操作实现的,而自定义排序则需要实现WritableComparable接口并重写compareTo方法。这种灵活性使得用户可以根据具体业务需求对数据进行复杂排序,从而优化...

    Hadoop mapreduce实现wordcount

    【标题】Hadoop MapReduce 实现 WordCount MapReduce 是 Apache Hadoop 的核心组件之一,它为大数据处理提供了一个分布式计算框架。WordCount 是 MapReduce 框架中经典的入门示例,它统计文本文件中每个单词出现的...

    Hadoop大作业排序.zip

    Hadoop大作业排序代码 由于 MapReduce 中对 key 进行比较和排序,而 key 可以是任何实 现了 Writable 接口的类。 在 java 中,要实现类的大小比较可以实现 Comparable 接口并通 过重写 compareTo 方法来实现。 在 ...

    hadoop 构建与实现大数据解决方案

    ### Hadoop构建与实现大数据解决方案 #### 一、Hadoop简介及重要性 Hadoop是一个开源框架,用于处理和存储大规模的数据集。它基于Google的两篇重要论文——Google File System (GFS) 和 MapReduce 的概念而创建。...

    基于Hadoop大数据平台实现遗传算法并行化

    Hadoop的并行环境使得在大数据集上进行非支配排序成为可能,通过分布式计算可以快速找出不同代的帕累托前沿,进而指导种群向更好的解空间移动。 在Hadoop平台上实现遗传算法并行化,还需要考虑数据通信和协调问题。...

    Hadoop实现大矩阵乘法

    在大数据处理领域,Hadoop是一个不可或缺的开源框架...通过分析和运行提供的代码,学习者不仅可以掌握大矩阵乘法的分布式实现,还能深入理解Hadoop的工作原理和编程技巧,对于进一步探索大数据处理领域具有很高的价值。

    hadoop shuffle和排序1

    在Hadoop MapReduce框架中,shuffle和排序是两个至关重要的步骤,它们发生在map阶段和reduce阶段之间,确保数据被正确地处理和聚合。下面将详细解释这两个概念以及它们的工作流程。 首先,shuffle(洗牌)过程是...

    java WriteHDFS实现,hadoop应用

    java WriteHDFS实现,hadoop应用java WriteHDFS实现,hadoop应用java WriteHDFS实现,hadoop应用java WriteHDFS实现,hadoop应用java WriteHDFS实现,hadoop应用java WriteHDFS实现,hadoop应用java WriteHDFS实现,...

    Hadoop 自定义 Partitioner 实现

    Hadoop 自定义 Partitioner 实现

    hadoop实现分区二次排序代码示例.zip

    在大数据处理领域,Hadoop是一个不可或缺的开源框架,它提供了分布式存储和计算的能力。本示例中的"had

    基于hadoop的简易云盘实现.zip

    【标题】"基于hadoop的简易云盘实现.zip"揭示了这个项目是关于利用Hadoop框架构建一个简单的云存储服务。Hadoop是一个开源的分布式计算框架,它允许处理和存储大量数据,尤其适合大数据处理场景。这个简易云盘的实现...

    hadoop.ziphadoop实现的搜狗实验用java实现的

    通过Java实现的Hadoop搜狗实验,不仅展示了Hadoop在处理大规模数据时的能力,也突显了Java在分布式计算中的灵活性。这个实验可以帮助学习者理解Hadoop的运作机制,提升他们在大数据领域的实践能力。对于企业和开发者...

    Java课设基于Hadoop的kmeans实现对NBA球队球风聚类源码.zip

    Java课设基于Hadoop的kmeans实现对NBA球队球风聚类源码.zipJava课设基于Hadoop的kmeans实现对NBA球队球风聚类源码.zipJava课设基于Hadoop的kmeans实现对NBA球队球风聚类源码.zipJava课设基于Hadoop的kmeans实现对NBA...

Global site tag (gtag.js) - Google Analytics