Scala 积累火花流数据流的最佳解决方案

Scala 积累火花流数据流的最佳解决方案,scala,apache-spark,spark-streaming,dstream,Scala,Apache Spark,Spark Streaming,Dstream,我正在寻找在Spark数据流中累积最后N条消息的最佳解决方案。我还想指定要保留的邮件数 例如,给定以下流,我希望保留最后3个元素: Iteration New message Downstream 1 A [A] 2 B [A, B] 3 C [A, B, C] 4 D [B, C, D] 到目前为止,我正在研究以下有关DStrea

我正在寻找在Spark数据流中累积最后N条消息的最佳解决方案。我还想指定要保留的邮件数

例如,给定以下流,我希望保留最后3个元素:

Iteration  New message  Downstream
1          A            [A]
2          B            [A, B]
3          C            [A, B, C]
4          D            [B, C, D]
到目前为止,我正在研究以下有关DStream的方法:

  • updateStateByKey:假设所有消息都有相同的密钥,我可以这样做。但是看起来有点奇怪,为什么这需要知道钥匙
  • mapWithState:Scala中的API对于这么简单的事情来说太单调了
  • 窗口:似乎不能完成这项工作,而且它需要一个窗口的时间值,而不是最后的元素数
  • 蓄能器:尚未真正使用

  • 实现这一点的最佳解决方案是什么?

    mapWithState
    正是您所需要的,而且绝对不会太繁琐:

    case class Message(x: String)
    def statefulTransformation(key: Int,
                               value: Option[Message],
                               state: State[mutable.MutableList[Message]]): Option[Message] = {
      def updateState(value: Message): Message = {
        val updatedList =
          state
            .getOption()
            .map(list => if (list.size > 3) list.drop(1) :+ value else list :+ value)
          .getOrElse(mutable.MutableList(value))
    
        state.update(updatedList)
        value
      }
    
      value.map(updateState)
    }
    
    现在你所需要的是:

    val stateSpec = StateSpec.function(statefulTransformation _)
    dStream.mapWithState(stateSpec)
    
    旁注-我使用了
    mutable.MutableList
    作为常量时间追加