开发者社区> 问答> 正文

在spark rdd级别中使用groupby的条件运算符 - scala

我正在使用Spark 1.60和Scala 2.10.5

我有这样的数据帧,

id needed
1 2
1 0
1 3
2 0
2 0
3 1
3 2

从这个df我创建了rdd这样的,

val dfRDD = df.rdd
从我rdd,我想分组id和计数needed是> 0。

((1,2),(2,0),(3,2))

所以,我试过这样的,

val groupedDF = dfRDD.map(x =>(x(0), x(1) > 0)).count.redueByKey(_+_)
在这种情况下,我收到一个错误:

错误:值>不是任何数据

展开
收起
社区小助手 2018-12-06 15:33:05 5156 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    问题是,在你map调用Row的apply 方法时,正如你在其scaladoc中看到的那样,该方法返回Any - 正如你可以看到的那样,错误和scaladoc中没有这样的方法在Any中 <

    您可以使用该getAs[T]方法修复它。

    import org.apache.spark.rdd.RDD
    import org.apache.spark.sql.SparkSession

    val spark =
    SparkSession

    .builder
    .master("local[*]")
    .getOrCreate()

    import spark.implicits._

    val df =
    List(

    (1, 2),
    (1, 0),
    (1, 3),
    (2, 0),
    (2, 0),
    (3, 1),
    (3, 2)

    ).toDF("id", "needed")

    val rdd: RDD[(Int, Int)] = df.rdd.map(row => (row.getAsInt, row.getAsInt))
    从那里你可以继续聚合,你的逻辑中有一些错误。
    首先,您不需要count通话。
    第二,如果你需要计算的次数"needed"大于你不能做的次数_ + _,因为这是所需值的总和。

    val grouped: RDD[(Int, Int)] = rdd.reduceByKey { (acc, v) => if (v > 0) acc + 1 else acc }

    val result: Array[(Int, Int)] = grouped.collect()
    // Array((1,3), (2,0), (3,2))
    PS:你应该告诉你的教授升级到Spark 2和Scala 2.11;)

    编辑
    在上面的例子中使用case类。

    final case class Data(id: Int, needed: Int)
    val rdd: RDD[Data] = df.as[Data].rdd
    val grouped: RDD[(Int, Int)] = rdd.map(d => d.id -> d.needed).reduceByKey { (acc, v) => if (v > 0) acc + 1 else acc }
    val result: Array[(Int, Int)] = grouped.collect()
    // Array((1,3), (2,0), (3,2))

    2019-07-17 23:18:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Time Series Analytics with Spark 立即下载
Just Enough Scala for Spark 立即下载
JDK8新特性与生产-for“华东地区scala爱好者聚会” 立即下载