经典topK问题

hadoop的入门问题是wordcount,而经典问题是TopK计算,比如热词,搜索链接热度等都是topK问题的变种

TopK问题使用MapReduce解决需要2步,而使用Tez解决可以缩减为一步,使用Tez其实也就是将2步MapReduce转化成DAG,一步完成,Tez大量复用了MapReduce代码。

这里我们讨论使用MapReduce解决问题

第一步wordcount,终于理解“道格”,把wordcount作为MapReduce编程的实例的用心了,哈哈,wordcount这里不再赘述

第二部翻转key和value

自己写一个key的排序编码,一下是代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">/***
 * 按词频降序排序
 * 的类
 *
 * **/
	public static class DescSort extends  WritableComparator{

		 public DescSort() {
			 super(IntWritable.class,true);//注册排序组件
		}
		 @Override
		public int compare(byte[] arg0, int arg1, int arg2, byte[] arg3,
				int arg4, int arg5) {
			return -super.compare(arg0, arg1, arg2, arg3, arg4, arg5);//注意使用负号来完成降序
		}

		 @Override
		public int compare(Object a, Object b) {

			return   -super.compare(a, b);//注意使用负号来完成降序
		}

	}</span>

这样就可以解决topK这个问题了,这里写的比较简略,理解概念,自行修改

时间: 2024-10-24 08:48:54

经典topK问题的相关文章

TopK问题,腾讯面试题:有100W个战斗力,取前100名的算法。

腾讯面试题:有100W个战斗力,取前100名的算法. 经典topK问题,结论是:随机选择算法 + 快排思想,通过随机选择算法,找到第k大的数,再进行一次快排中的partition,就能得到TopK的结果. 有篇大神的帖子,写的非常好,借鉴下 http://www.sohu.com/a/255145095_178889 原文地址:https://www.cnblogs.com/workharder/p/11980411.html

[经典] 在未排序数组中返回topK大的数

解法一,排序 先从大到小快排,然后扫前K个返回 时间复杂度:O(NlogN),空间复杂度O(1) 解法二,优先队列 前K个放入优先队列中,与最小堆顶元素比较大小,若大于则删除堆顶并插入:否则跳过 时间复杂度:O(NlogK),空间复杂度O(K) 解法三,堆调整 先将数组直接用完全二叉树存储,复杂度O(N):然后对树进行堆调整,调整为最大堆,复杂度不超过O(2N)(对每一层的操作总次数进行分析):最后弹出K个堆顶元素,复杂度不超过O(KlogN).由于K比N小得多,复杂度为O(N) 时间复杂度:O

简单的topK问题

/************************************************************************/ /* 求一组数据中的top(K)问题,这是一个经典的top(K)问题. 分析: 方法一:如果数据量不大,那么最常用的方法就是排序从大大小,然后找出前k个数据. 比较高效率的排序算法,如快排,堆排序等,总体时间复杂度为 O(N*log2(N))+O(K)=O(N*log2(N)) 或是直接用部分排序算法,如选择排序,直接找出前K个元素,时间复杂度为O

MapReduce实现TopK的示例

由于开始学习MapReduce编程已经有一段时间了,作为一个从编程中寻找自信和乐趣以及热爱编程的孩子来讲,手开始变得很“痒”了,很想小试一下身手.于是自己编写了TopK的代码.TopK的意思就是从原文件中找出词频排名前K的所有单词.首先分析该问题,从中我们可以得到启发:要想知道词频排名前K的所有单词,那么是不是要对所有的单词进行词频的统计啊?于是我们就联想到了一个比较经典的例子:WordCount的例子.是的,没错.就是它,统计原文件中每个单词的个数就靠它. 但是,我们词频统计出来了,接下来需要

脑洞大开--一条项目中常用的linux命令引发的经典算法题

小时候家里定了<读者>的月刊,里面记录一个故事:说有有个偏僻的乡村一日突然来了一个美女,她携着万贯家财子女在当地安家落户,成了当地的乡绅.她让她的子女世世代代的保守这个秘密,直到这个秘密不会再对家族带来灾难.她就是陈圆圆.当年吴三桂领清兵入关,冲冠一怒为红颜,改写了中国的历史,自己却能全身而退的那个人. 周五例行公事的查看一下离线数据推送项目的数据和log.将log用awk分段之后,我想知道实时数据前10个被重复发送的数据ID都被重复发送了几次,从而找到进一步优化的入手点,天知道我对这个项目已

一文搞定十大经典排序算法(Java实现)

本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一.排序算法概述 1.定义 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序. 2.分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较

215. 数组中的第K个最大元素(TOP-K问题)

问题: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 解答: 这道题属于一个很经典的问题,即求数据集中的最大第k个或者最小的前k个之类. 常规方法有以下几种: 1.排序: O(n logn).

解决TopK问题的方式

TopK问题的描述: 指定n个数字,找出其中最大的k个数,这就是经典的TopK问题 解决方法一:全局排序 将n个数进行全排序,取出最大的k个,即是所需的结果 代码: public int[] topK(int[] array, int k) { Arrays.sort(array); return Arrays.copyOfRange(array, array.length - k, array.length); } 时间复杂度是O(N*logN) 解决方法二:局部排序 其实没有必要将所有的元素

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第