是否可以使用reduceByKey((x,y,z)=> ...)?

时间:2014-11-24 13:11:36

标签: scala apache-spark

是否可以使用reduceByKey:reduceByKey((x, y, z) => ...)

因为我有一个RDD:

RDD[((String, String, Double), (Double, Double, scala.collection.immutable.Map[String,Double]))]

我希望按键减少,我尝试了这个操作:

reduceByKey((x, y, z) => (x._1 + y._1 + z._1, x._2 + y._2 + z._2, (((x._3)++y._3)++z._3)))

它显示了一条错误消息:missing parameter type

在我测试两个元素并且它有效之前,但有3个我真的不知道哪个是我的错误。这样做的方法是什么?

2 个答案:

答案 0 :(得分:2)

以下是您遗失的内容,reduceByKey告诉您,您有一个键值配对。从概念上讲,一对中只能有2个项目,它是成对的一部分。因此,reduceByKey的完整签名只能是2-Tuple的签名。所以,不,你不能直接拥有arity 3的功能,只有arity 2的功能。

以下是我如何处理您的情况:

reduceByKey((key,value) =>
  val (one, two, three) = key
  val (dub1, dub2, nameName) = value

  // rest of work
}

但是,让我提一个轻微的建议?使用case class作为您的价值。它更容易理解,基本上相当于你的3元组。

答案 1 :(得分:0)

如果在PairRDDFunctions上看到reduceByKey函数,它看起来像是

def reduceByKey(func: (V, V) => V): RDD[(K, V)]

因此,它不可能让它在3元组上工作。 但是,您可以将3元组包装到模型中,并将第一个字符串作为密钥使RDD成为RDD [(字符串,您的模型)],现在您可以以任何方式聚合模型。 希望这会有所帮助。