Python RDD的切片和分区之间有什么区别?

Python RDD的切片和分区之间有什么区别?,python,apache-spark,Python,Apache Spark,我正在使用Spark的Python API并运行Spark 0.8 我正在存储大量的浮点向量RDD,需要对整个集合执行一个向量的计算 RDD中的片和分区之间有什么区别吗 当我创建RDD时,我将其作为参数传递100,这使它将RDD存储为100个切片,并在执行计算时创建100个任务。我想知道,通过使系统能够更高效地处理数据,对数据进行分区是否会提高切片之外的性能(即,在分区上执行操作与在切片RDD中的每个元素上执行操作之间是否存在差异) 例如,这两段代码之间是否存在显著差异 rdd = sc.tex

我正在使用Spark的Python API并运行Spark 0.8

我正在存储大量的浮点向量RDD,需要对整个集合执行一个向量的计算

RDD中的片和分区之间有什么区别吗

当我创建RDD时,我将其作为参数传递100,这使它将RDD存储为100个切片,并在执行计算时创建100个任务。我想知道,通过使系统能够更高效地处理数据,对数据进行分区是否会提高切片之外的性能(即,在分区上执行操作与在切片RDD中的每个元素上执行操作之间是否存在差异)

例如,这两段代码之间是否存在显著差异

rdd = sc.textFile(demo.txt, 100)
vs


我相信在ApacheSpark中,
分区
是相同的东西

但是,您发布的两段代码之间存在细微但潜在的显著差异

此代码将尝试使用100个并发任务将
demo.txt
直接加载到100个分区中:

rdd = sc.textFile('demo.txt', 100)
对于未压缩文本,它将按预期工作。但是,如果您使用的不是
demo.txt
,而是
demo.gz
,您将得到一个只有1个分区的RDD。无法并行化对gzip文件的读取

另一方面,下面的代码首先将
demo.txt
打开到一个具有默认分区数的RDD中,然后它将显式地将数据重新分区到大小大致相等的100个分区中

rdd = sc.textFile('demo.txt')
rdd = rdd.repartition(100)
因此,在本例中,即使使用
demo.gz
,最终也会得到一个具有100个分区的RDD

作为旁注,我将您的
partitionBy()
替换为
repartition()
,因为我相信您正在寻找它
partitionBy()
要求RDD是元组的RDD。由于Spark 0.8.0中没有
repartition()
,因此您应该能够使用
coalesce(100,shuffle=True)

Spark可以为RDD的每个分区运行一个并发任务,最多可运行集群中的内核数。因此,如果您有一个具有50个核心的集群,那么您希望您的RDD至少有50个分区(很可能)

从Spark 1.1.0开始,您可以检查RDD有多少个分区,如下所示:

rdd.getNumPartitions()  # Python API
rdd.partitions.size     // Scala API
import org.apache.spark.Partitioner

val p = new Partitioner() {
  def numPartitions = 2
  def getPartition(key: Any) = key.asInstanceOf[Int]
}
recordRDD.partitionBy(p)

在1.1.0之前,使用Python API执行此操作的方法是
rdd。_jrdd.splits().size()
您可以按如下方式执行分区:

rdd.getNumPartitions()  # Python API
rdd.partitions.size     // Scala API
import org.apache.spark.Partitioner

val p = new Partitioner() {
  def numPartitions = 2
  def getPartition(key: Any) = key.asInstanceOf[Int]
}
recordRDD.partitionBy(p)