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

时间:2018-04-05 19:09:06

标签: java scala apache-spark streaming

我是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()

正如我所说,这肯定不起作用,但说明了我的问题。我需要在每个微缩模型的中间执行collect() - 类似操作,以便同时访问剩余的所有数据。我该怎么做呢?累加器是访问流式传输管道中间所有分区中所有累积数据的唯一方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,spark结构流返回DataFrame对象并且它不支持map和flatMap方法,因此您可以使用foreach方法来操作输入流数据并使用计数器来计算所有必需元素。