Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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[T]`拆分为Seq[RDD[T]]并保持顺序_Scala_Apache Spark_Spark Streaming_Rdd - Fatal编程技术网

Scala Spark:如何将RDD[T]`拆分为Seq[RDD[T]]并保持顺序

Scala Spark:如何将RDD[T]`拆分为Seq[RDD[T]]并保持顺序,scala,apache-spark,spark-streaming,rdd,Scala,Apache Spark,Spark Streaming,Rdd,如何有效地将RDD[T]分解为Seq[RDD[T]/Iterable[RDD[T]和n元素,并保留原始顺序 我希望能写出这样的东西 RDD(1, 2, 3, 4, 5, 6, 7, 8, 9).split(3) 结果应该是 Seq(RDD(1, 2, 3), RDD(4, 5, 6), RDD(7, 8, 9)) spark是否提供了这样的功能?如果不是,实现这一点的有效方法是什么 val parts = rdd.length / n val rdds = rdd.zipWithIndex(

如何有效地将
RDD[T]
分解为
Seq[RDD[T]
/
Iterable[RDD[T]
n
元素,并保留原始顺序

我希望能写出这样的东西

RDD(1, 2, 3, 4, 5, 6, 7, 8, 9).split(3)
结果应该是

Seq(RDD(1, 2, 3), RDD(4, 5, 6), RDD(7, 8, 9))
spark是否提供了这样的功能?如果不是,实现这一点的有效方法是什么

val parts = rdd.length / n
val rdds = rdd.zipWithIndex().map{ case (t, i) => (i - (i % parts), t)}.groupByKey().values.map(iter => sc.parallelize(iter.toSeq)).collect

看起来不是很快

从技术上讲,你可以按照你的建议去做。然而,在利用计算集群来执行大数据的分布式处理的情况下,这真的没有意义。它首先违背了整个火花点。如果执行groupByKey,然后尝试将这些数据提取到单独的RDD中,那么实际上就是将RDD中分布的所有数据拉到驱动程序上,然后将每个数据重新分布回集群。如果驱动程序无法加载整个数据文件,它也将无法执行此操作

您不应该从本地文件系统将大型数据文件加载到驱动程序节点。您应该将文件移动到分布式文件系统上,如HDFS或S3。然后,您可以通过
val lines=SparkContext.textFile(…)
将单个大数据文件加载到集群中的RDD行中。执行此操作时,集群中的每个工作进程将只加载文件的一部分,这是可以完成的,因为数据已经在分布式文件系统中跨集群分布

如果随后需要将数据组织到对数据的功能处理非常重要的“批次”中,则可以使用适当的批次标识符为数据键入,如:
val batches=lines.keyBy(line=>lineBatchID(line))

然后,可以将每个批次简化为一个批次级摘要,这些摘要可以简化为一个整体结果


为了测试Spark代码,可以将数据文件的小样本加载到一台机器上。但是当涉及到完整的数据集时,您应该利用分布式文件系统和spark群集来处理这些数据。

这没有任何意义-RDD是指围绕群集拆分的内容。您需要一组不同的群集节点,每个节点都有。。。对在所有群集节点上拆分的内容的引用??可能
rdd.mapPartitions(u.grouped(3))
会满足您的需求,但我建议您后退一步,从更高的层次上询问您的问题-您在这里真正想要实现什么?是的,您是对的。我需要像Seq[RDD[T]]或Iterable[RDD[T]]这样的东西。我将编辑这个问题…仍然没有太多意义-最好让RDD处于顶层,这样分区就尽可能粗糙。我知道你的意思。但是最初的RDD来自一个非常大的文件,对于我的用例,我必须处理这个文件的大批量,一个接一个地循环。。因为可以以分布式方式处理这些大批量产品中的每一个,所以它们必须是RDD类型。这有意义吗?你想处理所有这些,不是吗?因此,让每个集群节点完成批处理将比单独分发每个批处理更有效(我的意思是,我假设您的批处理比集群节点多)。(当然,3个元素的RDD是愚蠢的——集群开销将远远大于收益——尽管我相信这只是一个例子)