从RDD中有效地为每个密钥取一个值[(密钥,值)]

时间:2015-07-01 10:33:59

标签: scala apache-spark

我的起点是使用Apache Spark的Scala中的RDD [(键,值)]。 RDD包含大约1500万个元组。每个键大约有50 + -20个值。

现在我想为每个键取一个值(无关紧要)。我目前的做法如下:

  1. Hash通过密钥分配RDD。 (没有明显的偏差)
  2. 按键对元组进行分组,得到RDD [(键,值数组)]]
  3. 获取每个值数组的第一个
  4. 基本上看起来像这样:

    ...
    candidates
    .groupByKey()
    .map(c => (c._1, c._2.head)
    ...
    

    分组是昂贵的部分。它仍然很快,因为没有网络随机播放,候选人在内存中,但我可以更快地完成吗?

    我的想法是直接在分区上工作,但我不确定我从HashPartition中获得了什么。如果我采用每个分区的第一个元组,我会得到每个密钥,但是根据分区的数量,可能只有一个密钥的多个元组?或者我会错过钥匙吗?

    谢谢!

1 个答案:

答案 0 :(得分:2)

reduceByKey如何使用返回第一个参数的函数?像这样:

candidates.reduceByKey((x, _) => x)