【问题标题】:Spark streaming group rdd by key and group on Paired RDDs and pick latest from each groupSpark streaming group rdd by key and group on Paired RDDs and pick latest from each group
【发布时间】:2017-12-18 16:30:53
【问题描述】:

spark 和 scala 的新手。试图在下面实现。我的消息如下所示(键、ID、版本、数据对象)

val transformedRDD = processedMessages.flatMap(message => {
    message.isProcessed match {
      case true => Some(message.key, message.id, message.version, message)
      case false => None
    }
  }).groupByKey

我想在每条消息上按 ID 分组并获取最新版本的消息,然后 groupbykey,然后调用如下所示的预定义方法

Ingest(key,RDD[dataObject])

【问题讨论】:

  • 这并不能回答您的问题,但可能会帮助您选择适合您需要的模块。如果您“刚接触 spark 和 scala”,为什么要使用 Spark Streaming。?!
  • 我在问题本身中没有看到任何 Spark Stream 引用。

标签: scala apache-spark spark-streaming


【解决方案1】:

在大多数情况下,您应该避免使用groupByKey,因为它可能会导致重新洗牌,这可能会非常昂贵。在您的用例中,您不需要groupByKey,而是可以使用reduceByKey

val transformedRDD = processedMessages
  // notice that we will have Rdd[(String, Message)] or PairRdd after this flatMap
  .flatMap(message => message.isProcessed match {
    case true => Some((message.id, message))
    case false => None
  })
  // after this reduction we will have latest message for each id
  .reduceByKey((m1: Message, m2: Message) => m1.version >= m2.version match {
    case true => m1
    case false => m2
  })
  // now we just want to keep message
  .map({ case (id, message) => message })

【讨论】:

  • 感谢您的信息...除了为每个 id 查找最新版本之外,我还需要再做一步,我必须如上所述按键分组以收集所有 rdds 到单个表
  • 对不起。我知道怎么写了。非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多