rdd -- topK

需求

对100万条在0~1000万之间的数据取 TopK
输入数据:
8995149,5191755,2093544,9816608,4360204,5507730,1289204,6166586,8955325,9567003,
8264570,5202810,5353570,279129,9281133,6205171,5684360,1666876,4727056,2383250,
9176282,2815703,5145176,7514591,8648912,4633139,4176111,8954834,1702148,7978927,

最小堆

最小堆,是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于其左子节点和右子节点的值。

最大堆

最大堆要求根节点的数据值既大于或等于左子树的数据值,又大于或等于右子树的数据值。
图片来自百度

求topk:最简单版

在每个mapPartition中建一个包含K个元素的数组,添加元素时,都和数组中最小/最大的元素比较,大于/小于就替换。缺点:速度慢。时间复杂度:O(n*K)

求topk:改进版

在每个mapPartition中建一个包含K个元素的最小堆/最大堆,添加元素时,都和数组中堆顶的元素比较,大于/小于就添加。时间复杂度:O(n*logK),最大topk使用最小堆,最小topk使用最大堆。

最大1000个元素的spark代码实现

object TopK {
  val K = 1000

  def mapPartitionFunc(iterator: Iterator[Int]): Iterator[Int] = {
    val minHeap = new PriorityQueue[Int](K)
    while (iterator.hasNext) {
      val next = iterator.next()
      if (!minHeap.isEmpty) {
        val head = minHeap.peek()
        if (minHeap.size < K || next >= head) {
          minHeap.offer(next)
        }
        if (minHeap.size > K) {
          minHeap.poll()
        }
      } else {
        minHeap.offer(next)
      }
    }
    val arr = minHeap.iterator()
    val list = ListBuffer[Int]()
    while (arr.hasNext) {
      list.+=(arr.next())
    }
    list.iterator
  }

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().master("local[4]").appName("topK").getOrCreate()
    val sc = spark.sparkContext
    val rdd = sc.textFile("./data")
    val data = rdd.flatMap(x => x.split(",")).map(x => x.toInt).mapPartitions(mapPartitionFunc).repartition(1).mapPartitions(mapPartitionFunc)
    data.collect().foreach(println)
  }
}

结果

9989631
9989661
9989634
9989765
9989742
9989726
9989664
9989831
9989855
9989755
9989831
9989772
9989770
9989871
9989723
9989835
9989884
9990107
9989879
9989782
9989786
9989926
9990061
9989873
9989791
9990042
9989803
9990453
9989891
9989917
9990293
9990051
9990008
9989909
9990027
9990452
9990110
9990236
9990118
9989903
9989896
9989971
9990719
9990489
9990164
9991490
9990264
9990015
9990097
9989821
9989882
9990224
9990703
9990036
9990097
9990855
9990481
9990035
9989908
9989987
9991144
9990366
9990609
9990214
9991910
9990770
9990830
9990483
9989926
9990618
9990240
9990594
9990708
9990998
9990456
9990887
9991351
9990626
9990665
9990384
9989968
9989909
9990025
9990063
9991399
9992321
9992135
9990717
9991123
9991542
9990213
9993214
9991680
9990926
9990308
9990635
9990020
9990107
9990310
9990011
9990199
9989917
9992541
9991215
9990364
9991095
9990791
9990959
9990105
9990839
9990690
9991190
9991006
9990549
9990500
9990549
9990334
9990032
9991100
9990129
9991126
9991235
9991234
9991444
9991879
9991022
9991250
9990629
9990439
9993009
9992490
9991583
9991182
9993028
9991647
9991715
9992642
9990295
9991423
9991177
9992020
9993573
9992279
9993491
9990633
9991077
9991214
9992099
9991841
9990622
9992139
9993511
9991202
9992716
9993959
9992246
9991318
9990802
9990857
9990842
9990639
9991747
9993098
9991489
9991336
9991129
9992317
9991399
9994305
9992644
9992172
9992387
9993509
9992852
9992368
9991218
9993313
9993067
9993032
9993285
9993373
9990239
9992255
9993291
9993577
9992498
9992243
9991435
9992429
9991682
9990798
9990729
9992015
9991720
9990579
9992138
9991216
9990947
9993889
9990559
9991070
9991272
9991009
9992568
9994138
9993899
9993078
9992328
9992254
9990977
9990455
9991508
9993128
9991921
9991542
9991405
9991603
9990642
9990941
9991721
9991090
9991042
9993400
9993214
9992411
9991909
9992183
9992255
9991588
9990928
9990688
9990576
9990797
9992117
9991034
9991282
9991329
9994084
9991148
9990976
9990618
9991354
9991177
9992098
9991769
9991789
9992032
9993545
9992524
9992075
9992563
9992227
9991739
9991833
9993715
9996580
9992410
9996597
9991890
9994236
9997538
9993914
9993378
9992271
9993377
9993664
9992625
9993755
9993681
9992136
9991760
9998832
9993470
9996223
9992688
9991252
9990524
9991752
9993619
9992165
9996335
9992777
9992462
9995849
9998498
9995286
9994012
9996393
9994381
9995977
9992748
9993862
9995642
9993023
9991471
9992120
9995567
9993765
9991861
9991330
9993781
9993724
9995793
9993616
9995320
9992692
9993059
9993204
9998616
9996724
9994524
9994568
9993392
9993534
9993423
9991457
9991128
9994275
9995376
9991141
9991565
9992281
9994453
9994053
9992122
9994851
9993797
9991938
9992786
9994038
9993392
9991140
9992456
9992696
9994099
9994829
9991655
9995551
9994547
9993476
9995525
9993300
9992308
9993450
9992798
9995673
9993946
9995158
9994983
9996452
9992581
9991278
9992009
9994619
9994328
9993874
9995349
9993526
9996338
9995616
9994929
9996770
9994595
9995109
9997240
9995829
9996467
9997251
9993426
9995411
9996160
9995564
9993434
9993326
9992445
9991948
9992501
9993421
9993130
9994701
9991931
9991173
9994006
9990808
9991826
9993112
9994443
9994757
9995100
9991798
9991898
9995158
9993114
9994378
9992540
9994776
9996135
9994500
9994682
9993648
9991015
9993278
9993654
9992508
9992157
9991068
9994317
9994759
9993639
9994146
9996105
9995791
9999144
9993481
9993541
9996308
9992904
9993074
9992587
9996533
9993397
9992369
9995493
9992056
9993412
9994941
9993138
9992771
9993715
9996238
9992853
9995570
9997725
9995351
9992172
9997284
9991517
9991226
9993102
9995582
9991833
9992014
9996779
9994477
9994522
9996855
9995914
9994284
9993845
9993343
9992567
9993624
9996525
9992576
9994461
9994905
9992284
9995801
9991921
9993400
9991689
9992333
9992066
9994306
9991725
9991424
9992411
9993880
9992238
9996935
9992601
9993644
9992126
9993082
9992829
9994373
9994875
9993272
9994360
9993938
9995080
9990780
9991962
9994517
9991419
9998276
9992830
9997325
9993201
9992334
9992066
9992444
9992556
9992106
9994514
9994698
9996850
9993361
9994418
9994035
9999150
9996159
9998326
9993095
9992338
9998470
9996945
9997896
9993992
9995553
9999806
9996740
9999954
9993503
9992603
9998609
9998505
9995859
9995147
9997546
9994542
9998051
9999498
9998023
9995837
9995193
9997420
9996007
9998454
9998123
9994841
9999831
9997477
9999854
9995699
9997820
9996041
9993940
9997269
9999314
9997111
9999275
9996909
9998895
9999968
9999823
9994882
9999003
9996784
9995395
9996069
9998363
9997197
9997659
9995103
9994287
9997146
9999815
9996432
9998421
9997022
9997266
9996519
9999665
9994683
9996698
9995964
9998422
9997326
9999844
9998822
9999057
9995841
9999988
9994771
9996818
9999983
9997619
9994493
9998443
9998364
9994390
9999525
9996016
9998768
9996596
9997537
9999847
9997840
9998588
9999898
9995054
9994350
9998650
9997124
9997531
9996129
9993944
9997233
9992837
9994207
9996533
9994592
9996894
9999117
9997577
9995815
9998074
9999387
9995543
9995839
9998428
9993377
9999875
9999275
9999533
9997114
9999658
9998618
9998716
9998286
9998496
9997358
9999662
9996592
9997793
9997458
9996191
9998887
9994476
9997557
9995115
9999634
9995232
9992429
9995675
9999404
9995624
9998066
9997665
9995072
9992955
9994215
9999744
9994097
9998411
9997526
9995927
9998226
9996820
9996068
9998301
9996360
9995959
9994039
9998265
9997182
9996965
9999626
9994968
9996917
9999972
9998770
9993743
9998137
9995080
9994942
9998677
9995545
9998199
9996772
9995481
9997652
9998329
9999539
9996409
9999703
9995319
9997858
9997755
9995107
9997708
9996447
9996248
9994587
9997916
9999350
9995780
9998166
9994220
9997357
9999350
9997628
9997152
9997160
9999718
9998075
9997568
9995334
9998573
9998971
9996339
9996619
9993563
9998159
9993261
9993180
9999658
9998495
9995592
9996155
9996934
9994803
9997338
9999283
9995595
9998467
9996393
9996684
9999988
9998042
9996373
9999307
9997353
9998244
9998959
9995930
9997922
9996774
9999560
9999414
9996057
9996713
9998779
9996502
9997646
9999223
9999000
9995258
9998967
9999473
9996477
9997412
9999312
9997668
9998687
9997990
9998459
9998092
9995928
9999387
9999450
9999619
9994244
9999089
9993987
9999097
9999255
9999828
9995814
9995514
9994247
9998499
9992130
9993582
9997268
9997390
9997266
9996105
9998160
9998407
9996845
9998241
9998768
9995616
9999202
9999371
9998459
9997252
9997268
9992204
9999825
9997632
9997104
9999651
9994672
9993171
9999192
9999674
9998434
9998584
9996636
9996184
9998399
9996260
9994943
9999327
9998662
9998784
9997410
9994420
9992908
9999542
9997093
9995334
9993690
9994240
9993308
9994314
9994281
9996123
9996240
9993715
9999707
9995457
9996903
9998625
9996105
9993784
9997526
9994668
9998653
9998282
9998332
9999037
9999313
9999849
9998141
9999595
9996880
9995019
9999436
9998859
9996679
9996237
9998801
9993534
9993192
9995617
9997291
9997951
9994152
9996526
9995233
9999807
9998173
9997055
9997408
9995426
9993791
9994221
9999968
9996491
9993283
9998156
9996636
9999608
9996474
9996507
9997812
9998831
9999644
9994563
9997468
9995582
9998796
9999327
9999525
9998712
9998391
9998097
9999090
9998127
9994325
9998366
9997221
9991935
9993226
9994554
9998695
9996300
9999552
9992990
9996252
9996926
9999419
9996809
9996329
9999662
9999527
9994907
9998485
9997678
9999508
9995933
9997562
9995061
9995561
9998614
9995863
9995810
9992784
9997391
9997082
9994836
9997945
9999777
9997968
9998612
9996759
9999993
9996741
9997047
9994521
9994716
9998328
9996048
9998643
9993722
9994794
9994456
9994639
9996681
9995565
9999502
9999767
9993236
9996894
9999215
9998785
9994090
9995916
9991970
9993362
9996903
9997370
9995315
9992435
9996618
9997704
9999193
9996507
9999724
9997394
9994318
9998665
9997329
9999803
9995328
9996079
9993619
9997474
9996750
9995310
9996148
9997210
9993325
9996641
9999354
9996422
9996388
9999200
9998922
9995023
9992801
9998498
9996224
9995108
9995540
9994796
9999170
9999971
9999354
9994685
9995647
9999393
9998816
9996691
9994221
9998354
9998846
9997531
9999075
9997202
9998620
9994826
9998180
9993637
9992399
9998573
9998390
9998499
9996768
9999496
9998062
9999092
9997575
9994479
9999622
9999821
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值