我有一个问题,我需要在加入前从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
有什么想法吗?
答案 0 :(得分:0)
这并不能解决您的问题,但会使其更容易消化。您可以通过使用预期类型定义时间val / def / var标识符来拆分方法链并记录您在每个步骤中期望的类型。通过这种方式,您可以轻松找到类型不符合您期望的位置。
E.g。我希望您的act1Stream
和act2Stream
个实例属于DStream[(String, String)]
类型,暂时我会调用s1
和s2
。如果不是这样,请评论我。
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))
}
从那里可以通过填写...
部分来结束其余类型。逐行消除编译器错误,直到获得所需结果。随着
def window(windowDuration: Duration): DStream[T]
def transform[U](transformFunc: (RDD[T]) ⇒ RDD[U])(implicit arg0: ClassTag[U]): DStream[U]
def join[W](other: DStream[(K, W)])(implicit arg0: ClassTag[W]): DStream[(K, (V, W))]
def map[U](f: (T) ⇒ U)(implicit arg0: ClassTag[U]): RDD[U]
至少通过这种方式,您可以确切地知道预期类型和生成的类型不匹配。