Java 将collect()应用于Apache Spark结构化流数据集

Java 将collect()应用于Apache Spark结构化流数据集,java,scala,apache-spark,streaming,Java,Scala,Apache Spark,Streaming,我是Apache Spark的新手,目前正在开发结构化流媒体管道。在数据处理的中间,我需要做一点微不足道的操作,要求所有的数据(到目前为止)都存在。此时,管道中的数据量已大幅减少,执行类似.collect()-的操作不会成为瓶颈。我需要执行的操作基本上是将所有剩余的元素放在一个HashSet中,并进行一系列复杂的存在性检查。在此之后,我需要“重新进入”流媒体管道以执行对csv文件的各种写入 但是,尝试在流式管道上执行collect()会产生错误消息,这是可以理解的。下面是一个简单(愚蠢)的例子,

我是Apache Spark的新手,目前正在开发结构化流媒体管道。在数据处理的中间,我需要做一点微不足道的操作,要求所有的数据(到目前为止)都存在。此时,管道中的数据量已大幅减少,执行类似
.collect()
-的操作不会成为瓶颈。我需要执行的操作基本上是将所有剩余的元素放在一个HashSet中,并进行一系列复杂的存在性检查。在此之后,我需要“重新进入”流媒体管道以执行对csv文件的各种写入

但是,尝试在流式管道上执行
collect()
会产生错误消息,这是可以理解的。下面是一个简单(愚蠢)的例子,说明了我的问题:

// imports ...

val spark = SparkSession.builder
                        .appName("StructuredNetworkWordCount")
                        .getOrCreate()
val lines = spark.readStream
                 .format("socket")
                 .option("host", "localhost")
                 .option("port", 4444)
                 .load()

import spark.implicits._

// Split the lines into words
val words = lines.as[String].flatMap(_.split(" "))

// Won't work in a streaming context
val wordList = words.collectAsList()

// Perform some operations on the collected() data
val numWords = wordList.size
val doubledNum = numWords * 2

// Somehow output doubledNum
val query = wordCounts.writeStream
                      .outputMode("complete")
                      .format("console")
                      .start()

query.awaitTermination()
正如我所说,这肯定行不通,但说明了我的问题。我需要在每一个微批次中间执行<代码>集合()/<代码>类似的动作,以便同时访问所有剩下的数据。我该怎么做呢?累加器是访问流管道中间所有分区中所有累积数据的唯一方式吗?


谢谢

首先,spark structure streaming返回DataFrame对象,它不支持map和flatMap方法,因此您可以使用foreach方法,在该方法中,您可以操作输入流数据并使用计数器计算所有必需的元素