10亿数据中取最大的100个数据

本文探讨了从10亿个数据中筛选出最大100个数的三种高效算法:堆排序、快速排序思想和分块查找。通过详细分析每种方法的实现步骤与时间复杂度,帮助读者理解不同场景下算法的选择。

思路1:利用堆排序实现
(1)取前m个元素(例如m=100),建立一个小顶堆。保持一个小顶堆得性质的步骤,运行时间为O(lgm);建立一个小顶堆运行时间为m*O(lgm)=O(m lgm);
(2)顺序读取后续元素,直到结束。每次读取一个元素,如果该元素比堆顶元素小,直接丢弃。如果大于堆顶元素,则用该元素替换堆顶元素,然后保持最小堆性质。最坏情况是每次都需要替换掉堆顶的最小元素,因此需要维护堆的代价为(N-m)*O(lgm);最后这个堆中的元素就是10亿个数据中最大的100个。时间复杂度为O(N lgm)。’

思路2:根据快速排序划分的思想
(1)递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数
(2)对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分
(3)返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区间。如果个数不够,继续(3)操作,如果个数超过100的就重复1操作,直到最后右边只有100个数为止。

思路3:分块查找
先把10亿个数分成100份,每份1000w个数,然后在1000w个数中分别找出最大的100个数,最后在100*100个数中找出最大的100个。这里我想可以用分布式的处理,多台主机才会更快。

 

 

————————————————
版权声明:本文为优快云博主「企鹅也渴望飞翔」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/lweize325/article/details/51183823

### 处理大规模数据的分位数计算 针对100亿条记录的大规模数据,在HiveSQL中高效地进行分位数计算是一项挑战性的任务。由于Hive在处理大数据集时存在一定的局限性,特别是当涉及到复杂的统计运算如分位数计算时。 #### 使用采样方法降低计算复杂度 一种常见的策略是对原始数据进行随机抽样,从而减少参与实际分位数计算的数据量。这种方法可以在一定程度上牺牲精度换性能提升。通过合理设置样本比例,能够在满足业务需的前提下显著缩短查询时间[^3]。 ```sql SELECT percentile_approx(column_name, array(0.25, 0.5, 0.75)) FROM ( SELECT * FROM your_table TABLESAMPLE(BUCKET 1 OUT OF 10 ON RAND()) ) t; ``` 此代码片段展示了如何利用`TABLESAMPLE`子句抽原表的一部分作为样本,并对其应用近似百分位函数`percentile_approx()`来估算所需分位数值。 #### 利用分布式文件系统特性优化I/O操作 考虑到HDFS的设计初衷是为了支持海量数据存储与访问,因此可以通过调整输入路径模式或者预聚合的方式来改善读效率。例如,预先按照某些维度对数据进行分区或分桶能够有效缩小扫描范围,进而加快后续计算过程的速度[^1]。 ```sql CREATE TABLE IF NOT EXISTS quantiles_result AS WITH pre_aggregated_data AS ( -- 假设按日期字段partitioned_date进行了分区 SELECT partitioned_date, PERCENTILE_APPROX(value_column, ARRAY(0.25, 0.5, 0.75)) OVER (PARTITION BY partitioned_date) as percentiles FROM large_dataset ) -- 进一步汇总得到最终结果... ``` 这里展示了一个创建临时视图的例子,该视图基于已有的分区结构对每日数据单独解分位数后再做整体合并。 #### 调整资源分配参数增强并发能力 面对如此庞大的数据体量,适当增加集群资源配置也是必不可少的一环。这不仅包括扩大单个task的最大可用内存大小,还涉及调节map/reduce task的数量以充分利用硬件资源并行化执行任务。此外,还可以考虑启用压缩编码等方式减小中间传输开销,进一步提高整个流程的表现水平[^2]。 ```xml <property> <name>hive.exec.reducers.bytes.per.reducer</name> <value>67108864</value><!-- 设置每个reduce任务处理的最大字节数 --> </property> <property> <name>hive.map.aggr</name> <value>true</value><!-- 开启本地聚集选项加速部分聚合场景下的表现 --> </property> ``` 以上XML配置项说明了两个重要的属性设定:一个是控制Reducer数量的关键阈值;另一个则是允许Mapper阶段提前完成局部汇聚工作,有助于减轻下游组件的压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值