簡體   English   中英

Scala Spark RDD、數據集、PairRDD 和分區

[英]Scala Spark RDDs, DataSet, PairRDDs and Partitoning

在 Scala Spark 中,有幾種方法可以導致數據分區/重新分區。 其中包括partitionBy, coalesce, repartition, and textFile以及其他具有分區計數作為參數的函數。 下面,我使用至少有 8 個分區的規范的textFile 我不希望轉換來撤消這些分區。 對於要保留的分區,您需要persist化分區結果。 但是, mapflatMap等函數不保留分區。 我相信這會影響性能。 PairRDDS 具有維護分區的mapValues and flatMapValues

是否有用於map and flatMap DataSets and RDDs等效函數不會搞砸分區?

如果我把這些都搞混了,那么 RDD 和數據集如何維護分區,記住 map 和 flatMap 操作是它們操作的關鍵。

val tweets:RDD[Tweet] = mySpark.sparkContext.textFile(path,8).map(parseTweet).persist()
val numerical_fields_Tweets:Dataset[Tweet] = tweets.toDS()

下面是來自 youtube 視頻的屏幕截圖,說明 pairRDD 中的地圖會導致沒有分區器的 RDD

在 Spark 中,不重新分區/混洗數據的操作會保留分區(通過對先前建立的分區進行操作)。 mapflatMap就是這樣的操作:它們不會改變分區的數量。 此外, map不會更改分區內的行數或其順序。

RDD 和數據集如何維護分區

您正在混合兩個概念:(1) 在數據轉換過程中與數據關聯的分區器,以及 (2) 數據被拆分成的分區。

數據的分區方式與與數據關聯的分區器之間存在差異。 如上所述, mapflatMap不會改變分區的數量,但它們不保證與數據關聯的分區器。 考慮 RDD 的map

/**
 * Return a new RDD by applying a function to all elements of this RDD.
 */
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
  val cleanF = sc.clean(f)
  new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}

MapPartitionsRDD

private[spark] class MapPartitionsRDD[U: ClassTag, T: ClassTag](
    var prev: RDD[T],
    f: (TaskContext, Int, Iterator[T]) => Iterator[U],
    preservesPartitioning: Boolean = false, ...)

因此,雖然map不重新分區數據,但它不能保證與數據關聯的分區器,因為map修改行的方式沒有限制。

Pair RDD,即RDD[(K, V)] ,有些特殊,因為它們通常是分區操作的結果,如果我們使用mapValues而不是map ,我們可以確定分區器沒有改變,因為我們沒有觸及“鑰匙”。

/**
 * Pass each value in the key-value pair RDD through a map function without changing the keys;
 * this also retains the original RDD's partitioning.
 */
def mapValues[U](f: V => U): RDD[(K, U)] = self.withScope {
  val cleanF = self.context.clean(f)
  new MapPartitionsRDD[(K, U), (K, V)](self,
    (context, pid, iter) => iter.map { case (k, v) => (k, cleanF(v)) },
    preservesPartitioning = true)
}

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM