如何在DataStream上进行迭代

时间:2019-05-10 06:26:04

标签: scala apache-flink

我是Scala的新手。我有一个自定义类Analytics.scala,它具有很少的变量(var a,var b,var c)。在我的测试案例中,我得到了一个Analytics类型的DataStream,并且我想为每个对象将var c的值设置为“ 0”。

我尝试在DataStream上使用map函数,但没有帮助。我还尝试将流转换为列表,然后遍历该列表,但这也不起作用。

stream的类型为DataStream [Analytics]。这是我尝试过的:

stream.map(x => x.c=0)
val a = DataStreamUtils.collect(stream.javaStream).asScala.toArray.iterator
a.foreach(x => x.c=0)
在我的测试案例中,var c的

值未更改为0。

2 个答案:

答案 0 :(得分:1)

通常,Flink DataStream并不是一个有限的集合,您可以迭代一次并完成它-它是一个潜在的无界流,只会不断拥有更多数据。

使用地图是正确的方法。但是,当您将地图应用于流时,如

stream.map(x => x.c=0)

您正在描述流转换,而不是修改流本身。您应该尝试

streamWhereCisZero = stream.map(x => x.c=0)

这将创建一个新的流,其中每个元素的c都将设置为零。

答案 1 :(得分:0)

这就是我的迭代方式。不确定这是否是最佳解决方案。

val collection = DataStreamUtils.collect(stream.javaStream)
val results: Seq[Analytics] = collection.asScala.toSeq
for (result <- results){
    result.c=0
}