Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 带除法算子的火花减速器_Scala_Apache Spark_Division_Reduce - Fatal编程技术网

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)