Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Scala 如何将已排序的RDD拆分为n个部分,并从每个部分中获取第一个元素?_Scala_Apache Spark_Rdd_Accumulator - Fatal编程技术网

Scala 如何将已排序的RDD拆分为n个部分,并从每个部分中获取第一个元素?

Scala 如何将已排序的RDD拆分为n个部分,并从每个部分中获取第一个元素?,scala,apache-spark,rdd,accumulator,Scala,Apache Spark,Rdd,Accumulator,我试图从排序的RDD[String]中提取一些元素。我尝试使用zipWithIndex并通过余数将RDD过滤为零 val expectedSize = 165 val n = rddOfStrings.count / expectedSize val resultArray = rddOfStrings.sortBy(x => x).zipWithIndex.filter(x => x._2 % n == 0).map(_._1).collect 这里的问题是n并不总是整数。如果

我试图从排序的RDD[String]中提取一些元素。我尝试使用zipWithIndex并通过余数将RDD过滤为零

val expectedSize = 165
val n = rddOfStrings.count / expectedSize

val resultArray = rddOfStrings.sortBy(x => x).zipWithIndex.filter(x => x._2 % n == 0).map(_._1).collect
这里的问题是n并不总是整数。如果是双精度,resultArray的大小将不等于expectedSize+1或-1。如何使其返回相同大小的集合


另外,我通过向所有执行者传递一个集合对象来尝试spark accumulator。因为数据集非常大,所以失败了

165个部分不可能相等,真的-假设总尺寸不是165的乘积,其中一些部分必须比其他部分大

为了使这些部分尽可能均匀地分布,您可以使用一个非舍入的n,创建一个n、2n、3n…流,然后舍入该流中的每个元素以获得您要查找的元素的索引,然后使用contains过滤RDD:


你在这里的目标是什么?只是从数据集中获取一个样本spark实际上有一个可以使用的样本方法。我想将rdd分成165个相等的部分,并从每个部分中获取第一个head元素。
val expectedSize = 165
val n: Double = rddOfStrings.count.toDouble / expectedSize

val indices = Stream.iterate(0D)(x => x + n)
  .map(math.round)
  .take(expectedSize)
  .toList

val resultArray = rddOfStrings.sortBy(x => x)
  .zipWithIndex
  .filter(x => indices.contains(x._2))
  .map(_._1)
  .collect