Spark将DStream拆分为多个RDD

时间:2015-02-05 17:11:08

标签: apache-spark spark-streaming

同样的问题也适用于将RDD分成几个新的RDD。

DStream或RDD包含几个不同的案例类,我需要根据案例类类型将它们转换为单独的RDD。

我知道

val newRDD = rdd.filter { a => a.getClass.getSimpleName == "CaseClass1" }

val newRDD = rdd.filter { 
  a => a match { 
    case _: CC1 => true
    case _ => false
  }
}

但这需要通过原始RDD进行多次运行,每个案例类型一个。

  1. 必须有更简洁的方法来执行上述匹配过滤器?
  2. 有没有办法通过元素类型将rdd拆分成几个并且有一个并行传递?

2 个答案:

答案 0 :(得分:4)

1)对给定类型进行过滤的更简洁方法是使用rdd.collect(PartialFunction[T,U])

相当于

val newRDD = rdd.filter { a => a.getClass.getSimpleName == "CaseClass1" }

将是:

val newRDD = rdd.collect{case c:CaseClass1 => c}

它甚至可以与其他过滤和转换相结合:

val budgetRDD = rdd.collect{case c:CaseClass1 if (c.customer == "important") => c.getBudget}

rdd.collect(p:PartialFunction[T,U]) 不应与rdd.collect()混淆,后者会将数据传回驱动程序。


2)要分割RDD(或DSTream),filter是可行的方法。必须记住,RDD是分布式集合。过滤器将允许您通过群集并行地将该功能应用于该分布式集合的子集。

从原始RDD创建2个或更多RDD的结构将产生1对多的shuffle阶段,这将显着更昂贵。

答案 1 :(得分:1)

rdd.filter一样,我的表格很长。一个稍微简洁的版本是:

val newRDD = rdd.filter { case _: CC1 => true ; case _ => false }

你不能忽略case _ => false或者课堂测试并不详尽,你会得到错误。我无法让收集工作正常。

@maasg获得了关于进行单独过滤器传递的正确答案,而不是在一次传递中破解分割输入的方法。