分区排序aggregateByKey Spark

时间:2016-12-01 08:51:34

标签: scala apache-spark partitioning

所以,如果我之前有转变:

myRDD = someRDD.map()

mySecondRDD = myRDD.aggregateByKey(initValue)(CombOp , MergeOp)

在这一点上,myRDD没有分区器,但mySecondRDD有一个hashPartitioner。 首先我想问一下:

1)我是否必须在myRDD中指定分区程序?如果我这样做怎么可能将它作为参数传递给aggregateByKey?

*请注意,myRDD是一个转换,并且没有分区程序

2)在这两个命令结束时,myRDD是否与mySecondRDD具有相同的分区而不是没有?

3)这两个命令将进行多少次洗牌?

4)如果我在myRDD中指定了具有partitionBy的分区,并设法将其作为参数传递给aggregateByKey,我是否会将shuffle减少为1而不是2?

对不起,我还是不知道它是如何运作的。

1 个答案:

答案 0 :(得分:1)

我会尽力回答你的问题:

  1. 您不必明确指定分区程序。在您提供的代码中,Spark会自动分配它。如果RDD没有分区程序,则使用默认的HashPartitioner。看一下here了解更多详情。要指定自己的分区程序,您应该使用另一个版本的aggregateByKey(),它接受​​分区程序和初始值。它看起来像myRdd.aggregateByKey(initialValue, partitioner)(CombOp, MergeOp)

  2. 如果mySecondRDD已有myRDD,您的myRDD将使用aggregateByKey()中的分区程序,并且您未明确指定map()中的新分区程序。

  3. 您将只有1次随机播放操作,因为aggregateByKey()转换不会触发它。相反,func searchImages(pathURL: URL) -> [String] { var imageURLs = [String]() let fileManager = FileManager.default let keys = [URLResourceKey.isDirectoryKey, URLResourceKey.localizedNameKey] let options: FileManager.DirectoryEnumerationOptions = [.skipsPackageDescendants, .skipsSubdirectoryDescendants, .skipsHiddenFiles] let enumerator = fileManager.enumerator( at: pathURL, includingPropertiesForKeys: keys, options: options, errorHandler: {(url, error) -> Bool in return true }) if enumerator != nil { while let file = enumerator!.nextObject() { let path = URL(fileURLWithPath: (file as! URL).absoluteString, relativeTo: pathURL).path if path.hasSuffix(".png"){ imageURLs.append(path) } } } return imageURLs } 需要在一台机器上找到具有相同密钥的记录。

  4. 即使您保留代码,您也只能进行一次随机播放。