Scala 带除法算子的火花减速器
我有两套,一套是正片,一套是负片。数组中的第一个值是项标识,第二个值是这些项的总和Scala 带除法算子的火花减速器,scala,apache-spark,division,reduce,Scala,Apache Spark,Division,Reduce,我有两套,一套是正片,一套是负片。数组中的第一个值是项标识,第二个值是这些项的总和 positive: Array[(String, Int)] negative: Array[(String, Int)] 我想构造数组结果,它将包含项名称及其作为浮点数的正负比率。下面的命令只返回整数比率 val result = positive.union(negativeCount).reduceByKey((a, b) => (a / b) 你能告诉我如何使比率成为浮点数吗 谢谢。使用toF
positive: Array[(String, Int)]
negative: Array[(String, Int)]
我想构造数组结果,它将包含项名称及其作为浮点数的正负比率。下面的命令只返回整数比率
val result = positive.union(negativeCount).reduceByKey((a, b) => (a / b)
你能告诉我如何使比率成为浮点数吗
谢谢。使用
toFloat
val result = positive.union(negativeCount)
.mapValues(_.toFloat)
.reduceByKey((a, b) => (a / b))
据我所知,你应该使用
加入
而不是联盟
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
是没有意义的,也不能很好地保证值的顺序 我已经尝试过了,但它返回我:32:error:type mismatch;find:Float required:IntOh yes,因为reduce by key需要与输入类型相同的输出类型。在运行reduceByKey之前,先执行一个map(u.toFloat)
val result=positive.union(negativeCount).mapValues(u.toFloat).reduceByKey((a,b)=>(a/b)