带水印的Spark结构化流重复数据删除

时间:2020-08-10 09:22:22

标签: apache-spark spark-structured-streaming watermark drop-duplicates

我正在运行使用HDFS作为源并将Hive作为接收器的结构化流传输管道。我正在使用的Spark版本是 Spark 2.4.0-cdh6.2.1 。我需要在5分钟的滚动/静态窗口大小内对流数据帧中的数据进行重复数据删除。但是,我的数据框不包含任何事件“时间”列。我为达到预期效果而编写的代码是-

String eventTimeWatermarkingColumn = "custom_eventTime";

Dataset<Row> intermediateDSWithWatermarkingColumn = inputFileDS.withColumn(eventTimeWatermarkingColumn,
                functions.current_timestamp());

Dataset<Row> intermediateDS = intermediateDSWithWatermarkingColumn
                .withWatermark(eventTimeWatermarkingColumn, "5 minutes")
                .dropDuplicates(new String[]{"colA","colB","colC"});

在代码中,我在数据帧中添加了一个自定义时间戳列,该列具有当前时间戳作为值,并将其用作 withWatermark 方法的参数。

期望的行为: 使用上面的代码,我期望每隔5分钟的窗口帧应删除重复的记录(如果有),并在5分钟的窗口一次时间过去后,任何重复的记录都应允许。准确地说,我希望水印仅允许每5分钟窗口时间存储一次数据状态,一旦过了5分钟,以前的状态存储数据应该被删除。

应用程序行为: 但是,应用程序无法按需运行,而加水印不会产生任何效果,并且在5分钟窗口框架之内或之后插入的每个重复记录都是简单的被应用程序丢弃。我无法理解这种行为。这很危险,因为在某些时间点后可能导致对象内存不足错误。

这是否由于我们引入的自定义时间栏而发生?如果是这样,如何将自定义eventTime列添加到数据帧(架构中没有eventTime列)以使水印正常工作?

0 个答案:

没有答案