Spark结构化流2.3.0中的水印

时间:2019-06-14 05:53:57

标签: apache-spark apache-kafka spark-structured-streaming

我在Spark Structured Streaming 2.3.0中从Kafka读取数据。数据包含有关某些教师的信息,其中包括TeacherId,teacherName和TeacherGroupsIds。 TeacherGroupsIds是一个数组列,其中包含该组的ID。在我的任务中,我必须将具有组ID的列映射到包含有关组名称的信息的列([1,2,3] => [Suns,Books,Flowers])。名称和ID存储在HBase中,并且每天都可以更改。稍后,我必须将数据发送到另一个Kafka主题。

因此,我从两个来源读取数据-Kafka和HBase。我使用shc库从HBase读取数据。

首先,我分解数组列(组ID),然后再加入HBase中的数据。

在下一步中,我想使用TeacherId汇总数据。但是我使用的“附加模式”不支持此操作。

我尝试过加水印,但目前无法正常工作。我添加了带有时间戳的新列,然后按此列分组。

Dataset<Row> inputDataset = //reading from Kafka

Dataset<Row> explodedDataset = // explode function applied and join with HBase

Dataset<Row> outputDataset = explodedDataset
.withColumn("eventTime", lit(current_timestamp()))
.withWatermark("eventTime", "2 minutes")
.groupBy(window(col("eventTime"), "5 seconds"), col("teacherId"))
.agg(collect_list(col("groupname")));

实际结果显示输出处的数据框为空。没有任何行。

1 个答案:

答案 0 :(得分:0)

问题是current_timestamp()

current_timestamp返回该时刻的时间戳,因此,如果使用此列创建数据帧并打印结果,则打印当前时间戳,但是如果处理df并打印同一列,则打印新时间戳

该解决方案在本地工作,但是有时在分布式系统中会失败,因为工作人员在收到命令以打印数据时,该数据已经超出了时间戳范围。