键入参数化DStream

时间:2017-01-05 09:04:12

标签: scala apache-spark streaming apache-kafka type-parameter

DStream可以type parameter吗?

如果是,怎么样?

当我在lazy val qwe = mStream.mapWithState(stateSpec)(类参数)上尝试myDStream: DStream[(A, B)]时,我得到:

value mapWithState is not a member of org.apache.spark.streaming.dstream.DStream[(A, B)]
    lazy val qwe = mStream.mapWithState(stateSpec)

1 个答案:

答案 0 :(得分:2)

Spark API的大量子集需要隐式ClassTags(请参阅Scala: What is a TypeTag and how do I use it?),PairDStreamFunctions.mapWithState也不例外。检查class definition

class PairDStreamFunctions[K, V](self: DStream[(K, V)])
  (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K])

and

def mapWithState[StateType: ClassTag, MappedType: ClassTag](
    spec: StateSpec[K, V, StateType, MappedType]
  ): MapWithStateDStream[K, V, StateType, MappedType] = {
  ...
}

如果想要创建一个对通用对流进行操作并使用mapWithState的函数,则至少应为ClassTagsKeyType类型提供ValueType

def foo[T : ClassTag, U : ClassTag](
  stream: DStream[(T, U)], f: StateSpec[T, U, Int, Int]) = stream.mapWithState(f)

如果StateTypeMappedType也被参数化,那么您也需要ClassTags

def bar[T : ClassTag, U : ClassTag, V : ClassTag,  W : ClassTag](
  stream: DStream[(T, U)], f: StateSpec[T, U, V, W]) = stream.mapWithState(f)