Apache spark 如何从迭代器创建Spark RDD?

Apache spark 如何从迭代器创建Spark RDD?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,为了说明这一点,我不是在寻找像这样的数组/列表中的RDD List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); // sample JavaRDD<Integer> rdd = new JavaSparkContext().parallelize(list); List List=Arrays.asList(1,2,3,4,5,6,7);//样品 JavaRDD rdd=新的JavaSparkContext()

为了说明这一点,我不是在寻找像这样的数组/列表中的RDD

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); // sample
JavaRDD<Integer> rdd = new JavaSparkContext().parallelize(list);
List List=Arrays.asList(1,2,3,4,5,6,7);//样品
JavaRDD rdd=新的JavaSparkContext().parallelize(列表);

如何从java迭代器创建spark RDD而不在内存中完全缓冲

Iterator<Integer> iterator = Arrays.asList(1, 2, 3, 4).iterator(); //sample iterator for illustration
JavaRDD<Integer> rdd = new JavaSparkContext().what("?", iterator); //the Question
Iterator Iterator=Arrays.asList(1,2,3,4).Iterator()//示例迭代器
JavaRDD rdd=新的JavaSparkContext().what(“?”,迭代器)//问题
补充问题:


是否要求源代码可以重新读取(或能够多次读取)以提供RDD的弹性?换句话说,由于迭代器基本上只读取一次,所以甚至可以从迭代器创建弹性分布式数据集(RDD)吗?

正如其他人所说,您可以使用spark流做一些事情,但对于pure spark,您不能,原因是您提出的要求与spark的模型背道而驰。让我解释一下。 为了分配和并行化工作,spark必须将其分成若干块。从HDFS读取时,HDFS会对Spark执行“分块”,因为HDFS文件是以块的形式组织的。Spark通常会为每个块生成一个任务。 现在,迭代器只提供对数据的顺序访问,因此spark不可能在不在内存中读取所有数据的情况下将其组织成块


构建一个具有单个iterable分区的RDD是可能的,但即使如此,也无法确定iterable的实现是否可以发送给工作人员。使用sc.parallelize()时,spark会创建实现可序列化的分区,这样每个分区都可以发送到不同的工作区。iterable可以通过网络连接,也可以通过本地FS中的文件,因此除非在内存中缓冲,否则无法将它们发送给工作进程

这是一个非常古老的问题,但我会在序列化之后在平面图中创建迭代器

var ranges = Arrays.asList(Pair.of(1,7), Pair.of(0,5));
JavaRDD<Integer> data = sparkContext.parallelize(ranges).flatMap(pair -> Flux.range(pair.left(), pair.right()).toStream().iterator());
var ranges=Arrays.asList(一对(1,7),一对(0,5));
JavaRDD data=sparkContext.parallelize(ranges).flatMap(pair->Flux.range(pair.left(),pair.right()).toStream().iterator());

“没有在内存中完全缓冲它”。?您的迭代器不是已经在内存中了吗?在任何情况下,数据都将加载到内存中。但在我看来,您可以使用Spark Streaming来读取输入,因为您的只读迭代器可能被视为一个数据流。@KcDoD否。这个问题中使用的是插图。没错。。这是一个老问题,但是的,我通过尝试实现自定义RDD解决了这个问题。您所说的非常有意义,因为分区必须是可序列化的才能获得RDD。序列化迭代器没有意义。谢谢你的确认。