从https://spark.apache.org/docs/latest/api/scala/#org.apache.spark.rdd.PairRDDFunctions读取def查询方法:
def
lookup(key: K): Seq[V]
Return the list of values in the RDD for key key. This operation is done efficiently if the RDD has a known partitioner by only searching the partition that the key maps to.
如何确保RDD具有已知的分区程序?我知道RDD是在群集中的节点之间进行分区的,但只有语句searching the partition that the key maps to.
是什么意思?
答案 0 :(得分:1)
许多操作(特别是在键值对上)会在执行时自动设置分区,因为它可以通过减少网络流量来提高效率。例如(From PairRDDFunctions):
def aggregateByKey[U: ClassTag](zeroValue: U, numPartitions: Int)(seqOp: (U, V) => U,
combOp: (U, U) => U): RDD[(K, U)] = self.withScope {
aggregateByKey(zeroValue, new HashPartitioner(numPartitions))(seqOp, combOp)
}
请注意创建HashPartitioner
。如果您想查看是否有partitioner
,可以查看RDD
的{{1}}。您也可以通过partitionBy
答案 1 :(得分:0)
每个RDD可以选择为键值RDD定义一个分区器(例如,说RDD是散列分区的)。
实际上,在某些pairRDDFunction中,您可以指定分区器,通常在最后一个参数中。
或者如果您的RDD没有分区程序,可以使用partitionBy方法进行设置。
如果您的RDD已经有分区程序,则查找方法直接进行分区,如果没有分区,则直接扫描所有分区。