【问题标题】:Perform Multiple Transformation on a DStream对 DStream 执行多重转换
【发布时间】:2017-03-20 05:14:26
【问题描述】:

我是 Spark Streaming 的新手

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

1300

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)

【问题讨论】:

  • 那是什么版本的 Spark?
  • @JacekLaskowski 1.6.1 我知道它很旧,但我需要 Spark 使用的 Akka Actor 集成。

标签: scala apache-spark spark-streaming dstream


【解决方案1】:

试试这个:

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 的平均值。

【讨论】:

  • @JacekLaskowski 我认为唯一的区别是SQLContext 代替了SparkSession
  • xy.toDF 怎么样?我不记得它是否已经在 pre-2.0 中可用。
  • @JacekLaskowski 用于RDD[A]A <: Product,从 1.3 开始。
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多