假设我有一个字符串列表.我对它们进行过滤和排序,并将结果收集到驱动程序中.然而,事物是分布式的,每个RDD都有自己原始列表的一部分.那么,Spark如何实现最终排序顺序,它是否合并结果?
我不太清楚范围分区器在Spark中是如何工作的.它使用(水库采样)取样.我对计算输入边界的方式感到困惑.
// This is the sample size we need to have roughly balanced output partitions, capped at 1M.
val sampleSize = math.min(20.0 * partitions, 1e6)
// Assume the input partitions are roughly balanced and over-sample a little bit.
val sampleSizePerPartition = math.ceil(3.0 * sampleSize / rdd.partitions.length).toInt
Run Code Online (Sandbox Code Playgroud)
为什么计算的sampleSize应该乘以3.0?以及如何获得边界?有人能告诉我一些这方面的例子吗?谢谢!
关于如何获得RDDa和/或a 的分区数量有很多问题DataFrame:答案总是如下:
rdd.getNumPartitions
Run Code Online (Sandbox Code Playgroud)
要么
df.rdd.getNumPartitions
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是一个昂贵的操作,DataFrame因为
df.rdd
Run Code Online (Sandbox Code Playgroud)
需要转换DataFrame为rdd.这是运行所需时间的顺序
df.count
Run Code Online (Sandbox Code Playgroud)
我正在编写逻辑,可选择 repartition "s"或coalesce"sa" DataFrame- 基于当前分区数是否在可接受的值范围内,或者低于或高于它们.
def repartition(inDf: DataFrame, minPartitions: Option[Int],
maxPartitions: Option[Int]): DataFrame = {
val inputPartitions= inDf.rdd.getNumPartitions // EXPENSIVE!
val outDf = minPartitions.flatMap{ minp =>
if (inputPartitions < minp) {
info(s"Repartition the input from $inputPartitions to $minp partitions..")
Option(inDf.repartition(minp))
} else {
None
}
}.getOrElse( maxPartitions.map{ maxp =>
if (inputPartitions > maxp) …Run Code Online (Sandbox Code Playgroud)