【问题标题】:Efficient Way to take first n sorted elements in Spark Partitions在 Spark 分区中获取前 n 个已排序元素的有效方法
【发布时间】:2019-12-28 16:45:51
【问题描述】:

我已经从 Spark 中的数组创建了一个 RDD。我想从每个分区上取 n 个最小的元素。我每次都对每个分区的迭代器进行排序,并取前 n 个元素并将它们替换为 arr1 的元素。我的做法是

 var arr = (1 to 50000).toArray
 val n = 50
 val iterations = 100  
 val r = new Random() 
 val arr1 = Array.fill(n)(r.nextInt(10)) 

 val rdd = sc.parallelize(arr,3)
 rdd.mapPartitionsWithIndex{(index , it) =>  
 it=it.sortWith(_<_)

  for(i<- 0 until n){
   it(i) = arr1(i)   
  }
  it
 }

我想问在 Scala 中是否有任何有效的方法来执行相同的任务

【问题讨论】:

  • val rdd = sc.parallelize(arr,3) 你不是说 arr1 吗?
  • mapPartitions 也可以
  • 不相信代码
  • 不清楚,一看就不会跑
  • @thebluephantom 是 arr1 不是 arr。

标签: arrays scala apache-spark partition


【解决方案1】:
rdd.sortBy(x=>x)
.foreachPartition(y=>println(y.take(n).toList))

用你的用例替换 println

【讨论】:

  • 此代码将首先对整个 RDD 进行排序,然后在每个分区上取 n 个元素并打印出来
  • 如果分区中的数据很大,那么如果将排序实现到 scala seq/Array 等中,它可能会抛出 OOM ...... foreachPartition 返回没有排序的 Iterator .. 将其转换为 Seq 然后排序是可能的,但如果数据很大,OOM 是可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2020-02-11
  • 1970-01-01
  • 2020-04-22
  • 2012-12-27
相关资源
最近更新 更多