Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Spark分区中获取前n个排序元素的有效方法_Arrays_Scala_Apache Spark_Partition - Fatal编程技术网

Arrays 在Spark分区中获取前n个排序元素的有效方法

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,

我已经从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
 }
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))