Spark每日半小时(32)——结构化流式编程:Dataset/DataFrame API3

流式重复数据删除

我们可以使用事件中的唯一标识符对数据流中的记录进行重复数据删除。这与使用唯一标识列的静态重复数据删除完全相同。该查询将存储来自先前记录的必要数据量,以便它可以过滤重复记录。与聚合类似,我们可以使用带或不带水印的重复数据删除。

  • 使用水印:如果重复记录的到达时间有上线,则可以再事件时间列上定义水印,并使用guid和事件时间列进行重复数据删除。该查询将使用水印从过去的记录中删除旧的状态数据,这些记录不会再被重复。这限制了查询必须维护的状态量。
  • 没有水印:由于重复记录可能到达时没有界限,查询将来自所有过去记录的数据存储为状态。
Dataset<Row> streamingDf = spark.readStream(). ...;  // columns: guid, eventTime, ...

// Without watermark using guid column
streamingDf.dropDuplicates("guid");

// With watermark using guid and eventTime columns
streamingDf
  .withWatermark("eventTime", "10 seconds")
  .dropDuplicates("guid", "eventTime");

任意有状态的操作

许多用例需要比聚合更高级的有状态操作。例如,在许多用例中,我们必须从事件的数据流中跟踪会话。要进行此类会话,我们必须将任意类型的数据保存为状态,并使用每个触发器中的数据流事件对状态执行任意操作。从Spark2.2开始,这可以通过操作mapGroupWithState和更强大的操作来完成flatMapGroupWithState。这两个操作都允许我们在分组数据集上应用用户定义的代码以更新用户定义的状态。

不支持的操作

流式DataFrames/Datasets不支持一些DataFrame/Dataset操作。其中一些如下:

  • 流数据集尚不支持多个流聚合(即流式DF上的聚合链)。
  • 流数据集不支持限制和获取前N行。
  • 流数据集不支持去重操作。
  • 仅在聚合、完全输出模式之后,流数据集才支持排序操作。
  • 不支持流数据集上的几种外连接类型。

此外,有一些数据集方法不适用于流数据集。它们时立即运行查询并返回结果的操作,这对流式数据集没有意义。相反,这些功能可以通过显示启动流式查询来完成。

  • count():无法从流式数据集返回单个计数。而是使用ds.groupBy().count()返回包含运行计数的流数据集。
  • foreach():流数据集使用ds.writeStream.foreach()
  • show():使用控制台接收器。

如果我们尝试任何这些操作,我们将看到AnalysisException类似“Stream DataFrame/Dataset不支持操作***”。虽然其中一些可能在未来的Spark版本中得到支持,但还有一些基本上难以有效地实现流数据。例如,不支持对输入流进行排序,因为它需要跟踪流中接收的所有数据。因此,这基本上难以有效执行。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值