联盟没有发生Spark变换

时间:2017-06-12 20:15:52

标签: spark-streaming

我有一个Spark流,其中有记录流入。间隔大小为1秒。 我想结合流中的所有数据。所以我创建了一个空的RDD,然后使用transform方法,将RDD(在流中)与这个空的RDD结合起来。 我期待这个空的RDD最终拥有所有数据。 但是这个RDD总是空着。

另外,有人可以告诉我,我的逻辑是否正确。

JavaRDD<Row> records = ss.emptyDataFrame().toJavaRDD();
JavaDStream<Row> transformedMessages = messages.flatMap(record -> processData(record))
                    .transform(rdd -> rdd.union(records));

transformedMessages.foreachRDD(record -> {
System.out.println("Aman" +record.count());
StructType schema = DataTypes.createStructType(fields);

Dataset ds = ss.createDataFrame(records, schema);
ds.createOrReplaceTempView("tempTable");
ds.show();

});

1 个答案:

答案 0 :(得分:0)

最初,records为空。

然后我们有transformedMessages = messages + records,但records为空,所以我们有:transformedMessages = messages(避免与讨论无关的flatmap函数)

稍后,当我们Dataset ds = ss.createDataFrame(records, schema); records时  仍然是空的。这不会改变程序的流程,因此随着时间的推移它将保持为空不变。

我认为我们想做的是,而不是

.transform(rdd -> rdd.union(records));

我们应该这样做:

.foreachRDD{rdd => records = rdd.union(records)} //Scala: translate to Java syntax

那就是说,请注意,因为这个过程会反复增加“记录”的谱系。 RDD并且还会随着时间累积所有数据。这不是一项可以在很长一段时间内保持稳定的工作,因为最终,如果有足够的数据,它将超出系统的限制。

没有关于这个问题背后的用例的信息,但目前的方法似乎不具有可扩展性和可持续性。