一、海量数据的Top-K问题
方法一:分治思想/Hash映射 + HashMap统计 + 堆/快速/归并排序
第一步:针对数据太大,内存受限,只能是:把大文件取模映射成小文件;如果内存足够,直接hashTable统计,然后排序。
第二步:使用HashMap统计每个词的出现次数;
第三步:借助堆结构,我们可以在log量级的时间内查找和调整/移动。
具体做法1:
维护一个K大小的小根堆,然后遍历300万的Query,分别和根元素进行对比。(这道题目因为是找“最大”的10个,所以用小根堆,每次遍历的元素只要和堆中最小的元素——“根”作比较,如果小于根,说明肯定进不了topK;如果大于根,说明它可以淘汰堆中的最小的一个元素,也就是根,然后再调整)
具体做法2:
具体做法3:
补充:小顶堆:是一棵完全二叉树,并且,它所有父节点的值小于或等于两个子节点的值。最小堆的存储结构(物理结构)实际上是一个数组。
相关连接:
二、大数据量的查询如何进行优化
思路:
在hive中,由于Hql的执行依赖于MR,所以先考虑如何到如何优化MR程序;
其次,考虑到Hadoop的特殊的优化(JVM重用,开启并行执行,开启fetch抓取等等);
最后,考虑到Hive sql查询语句的优化。
1、 写查询语句时,要把查询的字段一一列出查询时,不要使用类似select * from x_table的语句,要尽量使用select id,name from x_table,以避免查询出不需要的数据浪费资源。对于海量数据而言,一个字段所占用的资源和查询时间是相当可观的;
2、考虑到索引和分区表的使用;
3、对大表进行分区,根据不同的业务以及数据特征,采用不同的分区方法。比如,销售,可以考虑采用间隔分区技术,多分公司或是多部门,可以考虑采用列表分区或是上述的组合分区等。
等等,详见本系列文章的Hive调优。