Spark - 使用除法运算符减少

Spark - Reduce with division operator

我有两套,一套是正样本,一套是负样本。数组中的第一个值是项目标识,第二个值是指这些项目的总和。

positive: Array[(String, Int)]

negative: Array[(String, Int)]

我想构造数组结果,其中将包含项目名称及其正负比作为浮点数。下面的命令returns我只有整数比。

val result = positive.union(negativeCount).reduceByKey((a, b) => (a / b)

请问如何使比率成为浮点数?

谢谢。

使用 toFloat

使其中一个整数浮点数
val result = positive.union(negativeCount)
  .mapValues(_.toFloat)
  .reduceByKey((a, b) => (a / b))

据我了解您的意图,您应该使用 join 而不是 union

val positive = sc.parallelize(Seq(("a", 1), ("b", 2)))
val negative = sc.parallelize(Seq(("a", 4), ("b", 1)))

val ratios = positive
  .join(negative)
  .mapValues{case (x: Int, y: Int) => x.toFloat / y}

ratios.collect
// Array[(String, Float)] = Array((a,0.25), (b,2.0)) 

使用数据框:

val ratiosDF = positive.toDF("pk", "pv")
  .join(negative.toDF("nk", "nv"), $"pk" === $"nk")
  .select($"pk".alias("k"), $"pv".divide($"nv").alias("v"))
ratiosDF.show

// +---+----+
// |  k|   v|
// +---+----+
// |  a|0.25|
// |  b| 2.0|
// +---+----+

使用 union 后跟 reduceByKey 没有任何意义,并且不能对值的顺序提供强有力的保证。