【问题标题】:ReducyByKeyAndWindowByCount in Spark stateful streaming aggegationsSpark 有状态流聚合中的 ReducyByKeyAndWindowByCount
【发布时间】:2018-01-16 04:54:11
【问题描述】:

我必须内连接从 Oracle 中提取的两个关系表。

实际上,我想执行 1 对 1 连接,以便每个主键获取一行,并从第二个表中聚合列表值。因此,在加入 1 对 1 两个表之前,我必须通过键将所有行减少为 1,并将值保留在列表中。

这是我需要的说明: [![表聚合][1]][1]

在这里我遇到了一个问题,即何时停止对我的密钥进行聚合并将聚合实体传递到下一步。 Spark 通过为迟到的数据提供窗口间隔和造水来提供解决方案。因此保持数据一致性的假设是它接收数据的时间。它对于无限数据集是可行且适用的,但在我的情况下,我完全知道每个键的聚合计数。例如,对于 customer_id 1000,我确切地知道只有 3 种产品,并且在我聚合 3 种产品之后,我知道我现在可以停止聚合并进入管道中的下一个流式处理步骤。如何使用 Spark 和流式传输来实现此解决方案?我知道有 reduceByKeyAndWindow 操作,但在我的情况下,我需要 reduceByKeyAndWindowByCount 之类的东西。

计数将存储在静态数据集中,或者简单地将其存储在一行中作为附加数据。

【问题讨论】:

    标签: apache-spark-sql spark-streaming reduce apache-spark-dataset


    【解决方案1】:

    最后,我们决定从流式处理切换到使用批处理的核心 Spark,因为我们的数据集有限,而且这对我们的用例非常有效。我们得出的结论是,Spark Streaming 是为处理连续数据集而设计的(这实际上仅从它的命名中就可以明显看出)数据集。这就是为什么我们只有按时间和水印的窗口间隔来纠正运输过程中的网络或其他延迟。我们还发现我们的计数器设计丑陋、复杂,换句话说很糟糕。这是一个糟糕设计的活生生的例子,而这种日益增长的复杂性表明我们正朝着错误的方向前进,并试图将一个工具用于它不是为它设计的目的。

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多