在DStream上执行多次转换

时间:2016-11-06 22:42:49

标签: scala apache-spark spark-streaming dstream

我是一个相当新的Spark Streaming

我的流数据包含两个值x y。例如

  

1 300

     

2 8754

     

3 287

在流数据中,我想得到最小的y值,最大的y值和x值的平均值。这需要输出如下(使用上面的例子):

  

287 8754 4

我已经能够在单个转换/缩减上计算这些值,但无法使用单个转换

以下是我目前的代码

val transformedStream = windowStream.map(line => {
  Array(line.split(" ")(0).toLong, line.split(" ")(1).toLong)

val smallest: DStream[Double]  = transformedStream.reduce((a,b) => {
  Array(0, math.min(a(1), b(1)))
}).map(u => u(1).toDouble)

val biggest  = transformedStream.reduce((a,b) => {
  Array(0, math.max(a(1), b(1)))
}).map(u => u(1).toDouble)

val mean = transformedStream.reduce((a, b) => Array( (a(0) + b(0))/2 )).
  map(u => u(0).toDouble)

1 个答案:

答案 0 :(得分:2)

试试这个:

val spark: SparkSession = ???
import spark.implicits._

windowStream.transofrm( rdd => {
  val xy = rdd.map(_.split(" ")).collect {
    case Array(x, y) => (x.toLong, y.toLong)
  }
  xy.toDF("x", "y").agg(min("y"), max("y"), mean("x"))
  .as[(Long, Long, Double)].rdd
})

重要的:

transformedStream.reduce((a, b) => Array( (a(0) + b(0))/2 )  

不计算x的平均值。