Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在spark中将单个RDD划分为多个RDD_Scala_Apache Spark - Fatal编程技术网

Scala 如何在spark中将单个RDD划分为多个RDD

Scala 如何在spark中将单个RDD划分为多个RDD,scala,apache-spark,Scala,Apache Spark,我有一个RDD,其中每个条目都属于一个类。我想将单个RDD分离成几个RDD,这样一个类的所有条目都会进入一个RDD。假设我在输入RDD中有100个这样的类,我希望每个类都有自己的RDD。我可以为每个类使用一个过滤器(如下所示),但它会启动几个作业。有没有更好的方法在一份工作中做到这一点 def method(val input:RDD[LabeledPoint], val classes:List[Double]):List[RDD] = classes.map{lbl=>i

我有一个RDD,其中每个条目都属于一个类。我想将单个RDD分离成几个RDD,这样一个类的所有条目都会进入一个RDD。假设我在输入RDD中有100个这样的类,我希望每个类都有自己的RDD。我可以为每个类使用一个过滤器(如下所示),但它会启动几个作业。有没有更好的方法在一份工作中做到这一点

def method(val input:RDD[LabeledPoint], val classes:List[Double]):List[RDD] = 
      classes.map{lbl=>input.filter(_.label==lbl)}

这与另一个问题类似,但我有两个以上的课程(大约10个)

我面临着同样的问题,不幸的是,根据我找到的不同资源,没有其他方法

问题是,您需要从RDD创建结果中的实际列表,如果您查看,答案也会说这是不可能的


你所做的应该是好的,如果你想优化事情,那么只要尽可能去缓存数据就行了。

好吧,这是不可能的,但你可能会有概念上的问题


根据您的评论,您可能需要使用
aggregateByKey()
。无需创建100个RDD,只需按类设置一个键,并构建一个自定义聚合方法来聚合您的统计数据。Spark将按类分发您的实例,以便您可以独立地对它们进行操作。如果逻辑根据类的不同而变化,则始终可以使用If/else、switch、多态性等。

是否有任何方法可以更改spark代码以支持这一点。RDD是一组分区。一个分区可以分为List[List[]。如何划分分区以创建RRD上的列表[RDD]操作返回其他RDD。这就是API的定义方式。我不会反对这个。您可能可以更改某些内容,但我认为它会破坏其他所有内容,并且会占用您相当多的时间,即使它有效,我也不确定它是否会被接受为拉动请求。缓存数据集是您能做的最好的事情,我想说您应该做什么。有什么理由不这样做吗?接受as缓存似乎有助于降低运行时成本。谢谢“我希望每个clas都有自己的RDD。”为什么?之后你会怎么处理他们?嗯。。。Spark RDD模型的创建并没有考虑到这些操作。但是如果你想要这样的东西。。。您始终可以使用最明显的方法(就像您所做的那样)。现在。。。关于在“单个作业”中实现这一点(单个RDD上的大多数操作实际上涉及多个作业,因此我不确定“单个作业”是什么意思,但假设您指的是O(n)个操作,而不依赖于类的数量)。。。根据RDD的当前理念,我认为这“不应该”是可能的。@Paul另一种方法(StatisticsSummary)期望RDD作为输入。我想得到每个类的汇总统计数据,我不认为这是一个真正的重复,因为你想划分为两个以上的RDD。我投票赞成b/c我真的很喜欢你的解决方案!我想为每个类创建一个RDD,而不是aggregateByKey,因为这会将一个类的值聚合到一个分区中。假设我只有5个类,将会有大量的数据移动。我还需要它,因为另一个方法(Statistics.colStats)需要RDD。因此,再次聚合和创建RDD的成本会很高。那么我想你就完蛋了,你必须通过过滤旧的RDD来创建每个新的RDD:-S,但请注意,agregateByKey首先在多个分区上单独聚合,然后才聚合中间结果(类似于hadoop合并器)。这就是为什么建议在groupByKey()上方使用它。根据您的版本,您还可以查看combineByKey()和reduceByKey()。也许你可以用这种方式重新编写你的统计数据。。。或者不…看看!