Arrays 在Spark分区中获取前n个排序元素的有效方法
我已经从Spark中的数组创建了一个RDD。我想从每个分区上取n个最小的元素。我每次都在每个分区对迭代器进行排序,然后取前n个元素,并用arr1的元素替换它们。我的做法是Arrays 在Spark分区中获取前n个排序元素的有效方法,arrays,scala,apache-spark,partition,Arrays,Scala,Apache Spark,Partition,我已经从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,
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
}
var arr=(1到50000)。toArray
val n=50
val迭代次数=100
val r=新随机数()
val arr1=数组填充(n)(r.nextInt(10))
val rdd=sc.parallelize(arr,3)
rdd.mapPartitionsWithIndex{(索引,it)=>
it=it.sortWith(_
将println替换为您的用例此代码将首先对整个RDD进行排序,而不是在每个分区上取n个元素,并将它们打印出来。如果分区中的数据较大,则如果将排序实现为scala seq/Array等,则可能会抛出OOM。foreachPartition返回没有排序的迭代器。将其转换为seq,然后对i进行排序这是可能的,但如果数据很大,OOM是可能的eval rdd=sc.parallelize(arr,3)你不是说arr1吗?mapPartitions也会很好。代码不清楚,可以看出它不会run@thebluephantom是的,arr1不是arr。
rdd.sortBy(x=>x)
.foreachPartition(y=>println(y.take(n).toList))