gpt4 book ai didi

apache-spark - Spark 将一个 DStream 拆分为多个 RDD

转载 作者:行者123 更新时间:2023-12-04 03:57:24 26 4
gpt4 key购买 nike

同样的问题也适用于将一个 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 按元素类型分成几个?

最佳答案

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 是一种分布式集合。 Filter 可让您在集群上并行地将函数应用于该分布式集合的子集。

从原始 RDD 结构创建 2 个或更多 RDD 将导致一对多洗牌阶段,这将大大增加成本。

关于apache-spark - Spark 将一个 DStream 拆分为多个 RDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com