【问题标题】:Spark - Reduce with division operatorSpark - 使用除法运算符减少
【发布时间】:2016-02-26 05:35:44
【问题描述】:

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

positive: Array[(String, Int)]

negative: Array[(String, Int)]

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

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

您能否建议如何将比率设为浮点数?

谢谢。

【问题讨论】:

    标签: scala apache-spark division reduce


    【解决方案1】:

    据我了解您的意图,您应该使用 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 是没有意义的,并且不能保证值的顺序。

    【讨论】:

      【解决方案2】:

      使用toFloat使其中一个整数浮动

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

      【讨论】:

      • 我试过了,但它返回我 :32: error: type mismatch;发现:需要浮点数:Int
      • 哦,是的,因为通过键减少需要与输入类型相同的输出类型。在运行 reduceByKey val result = positive.union(negativeCount).mapValues(_.toFloat).reduceByKey((a, b) => (a/ b) 之前执行 map(_.toFloat)
      猜你喜欢
      • 1970-01-01
      • 2019-11-09
      • 2014-10-28
      • 1970-01-01
      • 2018-11-08
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多