所以,如果我之前有转变:
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?
对不起,我还是不知道它是如何运作的。
答案 0 :(得分:1)
我会尽力回答你的问题:
您不必明确指定分区程序。在您提供的代码中,Spark会自动分配它。如果RDD没有分区程序,则使用默认的HashPartitioner。看一下here了解更多详情。要指定自己的分区程序,您应该使用另一个版本的aggregateByKey()
,它接受分区程序和初始值。它看起来像myRdd.aggregateByKey(initialValue, partitioner)(CombOp, MergeOp)
。
如果mySecondRDD
已有myRDD
,您的myRDD
将使用aggregateByKey()
中的分区程序,并且您未明确指定map()
中的新分区程序。
您将只有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
}
需要在一台机器上找到具有相同密钥的记录。
即使您保留代码,您也只能进行一次随机播放。