Scala 如何将已排序的RDD拆分为n个部分,并从每个部分中获取第一个元素?
我试图从排序的RDD[String]中提取一些元素。我尝试使用zipWithIndex并通过余数将RDD过滤为零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并不总是整数。如果
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