Spark流 - 转换两个流并加入

时间:2016-03-21 22:10:11

标签: scala apache-spark spark-streaming scala-collections

我有一个问题,我需要在加入前从spark中读取两个流。

一旦我进行了转换,我就再也无法加入了,我猜这个类型不再是DStream [(String,String)]而是DStream [Map [String,String]]

val windowStream1 = act1Stream.window(Seconds(5)).transform{rdd => rdd.map(_._2).map(l =>(...toMap)}
val windowStream2 = act2Stream.window(Seconds(5)).transform{rdd => rdd.map(_._2).map(l =>(...toMap)}

val joinedWindow = windowStream1.join(windowStream2)  //can't join

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这并不能解决您的问题,但会使其更容易消化。您可以通过使用预期类型定义时间val / def / var标识符来拆分方法链并记录您在每个步骤中期望的类型。通过这种方式,您可以轻松找到类型不符合您期望的位置。

E.g。我希望您的act1Streamact2Stream个实例属于DStream[(String, String)]类型,暂时我会调用s1s2。如果不是这样,请评论我。

def joinedWindow(
      s1: DStream[(String, String)], 
      s2: DStream[(String, String)]
    ): DStream[...] = {
  val w1 = windowedStream(s1)
  val w2 = windowedStream(s2)
  w1.join(w2)
}
def windowedStream(actStream: DStream[(String, String)]): DStream[Map[...]] = {
  val windowed: DStream[(String, String)] = actStream.window(Seconds(5))
  windowed.transform( myTransform )
}
def myTransform(rdd: RDD[(String, String)]): RDD[Map[...]] = {
  val mapped: RDD[String] = rdd.map(_._2)
  // not enough information to conclude 
  // the result type from given code
  mapped.map(l =>(...toMap)) 
}

从那里可以通过填写...部分来结束其余类型。逐行消除编译器错误,直到获得所需结果。随着

的文档

DStream[T]

  • def window(windowDuration: Duration): DStream[T]
  • def transform[U](transformFunc: (RDD[T]) ⇒ RDD[U])(implicit arg0: ClassTag[U]): DStream[U]

PairDStreamFunctions[K,V]

  • def join[W](other: DStream[(K, W)])(implicit arg0: ClassTag[W]): DStream[(K, (V, W))]

RDD[T]

  • def map[U](f: (T) ⇒ U)(implicit arg0: ClassTag[U]): RDD[U]

至少通过这种方式,您可以确切地知道预期类型和生成的类型不匹配。