首页 > 解决方案 > 带火花流的动态过滤器

问题描述

我将火花流用于以下用例:

  1. 我有一个卡夫卡主题 - 数据。在本主题中,我正在使用结构化 Spark 流传输实时数据并对其应用一些过滤器。如果应用过滤器后返回的行数大于 1,则输出为 1,否则输出为 0 以及查询中的其他一些数据。

    简而言之,假设我正在使用 -

    df.filter($A < 10) 
    

    其中“A”、“<”和“10”是动态的并且来自某个数据库。实际上,这些值来自我正在使用并更新 db 中的这些值的 kafka 主题。所以查询不是静态的,会在一段时间后更新。

  2. 此外,我将不得不对流的结果应用一些布尔阿尔及利亚运算符。例如 -

    df.filter($A < 10) AND df.filter($B = 1) OR df.filter($C > 1)... and so on
    

    在这里,每个原子操作(如 df.filter($A < 10))都返回 0 或 1,如上所述。最终结果保存到 mongo。

我想知道这两个问题是否可以使用结构化火花流来解决。如果没有,那么使用 RDD 吗?

否则,有人可以提出任何建议吗?

标签: mongodbapache-sparkapache-kafkaspark-streaming

解决方案


对于第一种情况,您可以使用本答案中所述的基于广播变量的方法。我也很幸运地使用了每个执行程序中定期重新获取的每个执行程序的瞬态值,如本答案的第二部分所述。

对于第二种情况,您将使用单个 filter() 调用来实现导致消息包含在输出流中的完整条件集。


推荐阅读