Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当流数据帧/数据集上存在不带水印的流聚合时,不支持追加输出模式_Java_Apache Spark_Spark Streaming_Spark Structured Streaming - Fatal编程技术网

Java 当流数据帧/数据集上存在不带水印的流聚合时,不支持追加输出模式

Java 当流数据帧/数据集上存在不带水印的流聚合时,不支持追加输出模式,java,apache-spark,spark-streaming,spark-structured-streaming,Java,Apache Spark,Spark Streaming,Spark Structured Streaming,我有一个卡夫卡流,我加载火花。来自卡夫卡主题的消息具有以下属性:bl_iban,被列入黑名单,时间戳。所以有IBAN,关于IBAN是否被列入黑名单(Y/N)的标志,还有那个记录的时间戳。 问题是一个IBAN可能有多个记录,因为超时的IBAN可能会被列入黑名单或“删除”。我想知道的是,我想知道每个IBAN的当前状态。然而,我从更简单的目标开始,那就是为每个IBAN列出最新的时间戳(之后我还要添加黑名单状态),因此我产生了以下代码(其中黑名单代表我从卡夫卡加载的数据集): 之后,我尝试使用以下代码将

我有一个卡夫卡流,我加载火花。来自卡夫卡主题的消息具有以下属性:
bl_iban
被列入黑名单
时间戳
。所以有IBAN,关于IBAN是否被列入黑名单(Y/N)的标志,还有那个记录的时间戳。 问题是一个IBAN可能有多个记录,因为超时的IBAN可能会被列入黑名单或“删除”。我想知道的是,我想知道每个IBAN的当前状态。然而,我从更简单的目标开始,那就是为每个IBAN列出最新的
时间戳
(之后我还要添加
黑名单
状态),因此我产生了以下代码(其中黑名单代表我从卡夫卡加载的数据集):

之后,我尝试使用以下代码将其打印到控制台:

StreamingQuery query = blackList.writeStream()
    .format("console")
    .outputMode(OutputMode.Append())
    .start();
我已经运行了我的代码,但出现以下错误:
在流式数据帧/数据集上存在不带水印的流式聚合时,不支持追加输出模式

因此,我将水印添加到数据集中,如下所示:

blackList = blackList.withWatermark("timestamp", "2 seconds")
                .groupBy("bl_iban")
                .agg(col("bl_iban"), max("timestamp"));
然后又犯了同样的错误。 有什么办法可以解决这个问题吗


更新: 在我的帮助下,我设法摆脱了那个错误。但问题是我仍然无法让我的黑名单发挥作用。我可以看到数据是如何从Kafka加载的,但从我的组操作之后,我得到了两个空批,就是这样。 来自卡夫卡的打印数据:

blackList = blackList.groupBy("bl_iban")
                .agg(col("bl_iban"), max("timestamp"));
+-----------------------+-----------+-----------------------+
|bl_iban                |blacklisted|timestamp              |
+-----------------------+-----------+-----------------------+
|SK047047595122709025789|N          |2020-04-10 17:26:58.208|
|SK341492788657560898224|N          |2020-04-10 17:26:58.214|
|SK118866580129485701645|N          |2020-04-10 17:26:58.215|
+-----------------------+-----------+-----------------------+
这就是我如何得到输出的黑名单:

blackList = blackList.selectExpr("split(cast(value as string),',') as value", "cast(timestamp as timestamp) timestamp")
                .selectExpr("value[0] as bl_iban", "value[1] as blacklisted", "timestamp");
这是我的集体行动:

Dataset<Row> blackListCurrent = blackList.withWatermark("timestamp", "20 minutes")
                .groupBy(window(col("timestamp"), "10 minutes", "5 minutes"), col("bl_iban"))
                .agg(col("bl_iban"), max("timestamp"));
Dataset blackListCurrent=blackList.withWatermark(“时间戳”,“20分钟”)
.groupBy(窗口(“时间戳”)、“10分钟”、“5分钟”)、栏(“bl_iban”))
.agg(col(“bl_iban”),max(“timestamp”);

链接到源文件:

在Spark中使用水印时,需要确保聚合了解窗口。本文提供了更多的背景知识

在您的例子中,代码应该是这样的

blackList=blackList.withWatermark(“时间戳”,“2秒”)
.groupBy(窗口(“时间戳”)、“10分钟”、“5分钟”)、栏(“bl_iban”))
.agg(col(“bl_iban”),max(“timestamp”);

重要的是,属性
timestamp
具有数据类型timestamp

现在,在使用了你的建议之后,我没有发现这个错误。但一旦我加载了数据(在控制台中输出),并想要输出分组黑名单,我只会得到两个空批,就是这样:(为了回答这个问题,我们需要看看您的数据是什么样子以及您是如何读取的。另外,您是如何将数据输出到控制台的?为什么不改变输出模式?我不知道您对Spark@user207421有多熟悉,但您可以先阅读本文: