我正在从kafka读取数据并对其进行一些汇总,然后保存到hdfs。我想将此数据与已写入同一目录中的hdfs的过去数据合并。由于过去的数据将不断更新,因此我无法将其与新数据连接,也无法对新数据执行聚合,因为结构化Streaming2.3.0不支持该聚合。根据文档
As of Spark 2.3, you cannot use other non-map-like operations before joins. Here are a few examples of what cannot be used.
Cannot use streaming aggregations before joins.
我已经尝试过进行流-流联接,但是那不起作用,因为我也想聚合新数据。所以我正在加入StramQueryListener的onQueryProgress方法。我只看到它在发布统计信息中的用途。这是在侦听器中处理数据的好习惯吗?如果没有,那有什么替代方法。
override def onQueryProgress(event: StreamingQueryListener.QueryProgressEvent): Unit = {
if(event.progress.numInputRows > 0 && event.progress.sink.description.startsWith("FileSink") && event.progress.sink.description.contains(outputPath)) {
processFlag = 0
}
if(event.progress.numInputRows == 0 && event.progress.sink.description.startsWith("FileSink") && event.progress.sink.description.contains(outputPath) && processFlag == 0) {
"processing here"
processFlag = 1
}
我正在获取每小时的数据,因此我有足够的窗口来处理数据。而且由于侦听器是在单独的线程中启动的,所以它也是非阻塞代码。