取RDD-spark-scala中的一列的平均值

时间:2018-04-02 06:03:13

标签: scala apache-spark

我有一个如下所示的数据集。我只需要知道如何在课堂上获得整个学生的物理标记的平均值。使用spark + scala whithout使用数据帧。

name|physics|biology
ram|30|40
sam|35|45
ravi|37|44

outout应该像

physics|34

提前致谢.....

2 个答案:

答案 0 :(得分:0)

如果你有一个RDD [String]为

val rdd = sparkContext.parallelize(Seq(
    ("ram|30|40"),
    ("sam|35|45"),
    ("ravi|37|44")
  ))

然后

//split and select three columns 
val average = rdd.map(_.split("\\|")).map(x => (x(0), x(1), x(2)))
              //calculate the mean of third column
              .map(_._2.toInt).mean()

这会给你价值34.0

或者你可以这样做

rdd.map(_.split("\\|")).map(_(1).toInt).mean()

希望这有帮助!

答案 1 :(得分:0)

您可以从Dataset过滤出物理列,然后使用以下两种方式之一找到平均值。

//first create your dataset
case class Result(name:String,physics:Int,biology:Int)
val ds = spark.createDataset(Array(Result("ram",30,40),Result("sam",35,45),Result("ravi",37,44)))

ds.show

//+----+-------+-------+
//|name|physics|biology|
//+----+-------+-------+
//| ram|     30|     40|
//| sam|     35|     45|
//|ravi|     37|     44|
//+----+-------+-------+

现在,您可以通过一种方式过滤物理列,然后转换为RDD并将mean函数应用于以下内容,

ds.map(_.physics).rdd.mean
//34.0

如果您不想转换为RDD,那么您可以执行类似的操作,

val physics = ds.map(_.physics)
val avg = physics.reduce(_+_)/physics.count
//34