首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FLINK,基于JSON动态输入数据(如map对象数据)的触发器事件

FLINK,基于JSON动态输入数据(如map对象数据)的触发器事件
EN

Stack Overflow用户
提问于 2020-07-10 22:42:25
回答 1查看 195关注 0票数 1

我想知道FLINK是否可以支持我的要求,我已经看了很多文章,但我不确定我的情况是否能解决

案例:我有两个输入源。A)事件b)ControlSet事件样本数据为:

代码语言:javascript
复制
event 1-
{
   "id" :100
   "data" : {
             "name" : "abc"
            }
}

event 2-
{
   "id" :500
   "data" : {
             "date" : "2020-07-10";
             "name" : "event2"
            }
}

如果您看到event-1和event-2在"data“中都有不同的属性。因此,考虑数据是自由格式字段,属性的名称可以相同或不同。

ControlSet会给我们指令来执行触发器。例如,触发条件可能如下所示

代码语言:javascript
复制
(id = 100 && name = abc) OR (id =500 && date ="2020-07-10")

请帮助我,如果这些场景可能在flink中运行,以及什么是最好的方式。我不认为patternCEP或SQL能帮上忙,也不确定event dataStream是否可以作为JSON对象,并且可以像JSON path那样查询。

EN

回答 1

Stack Overflow用户

发布于 2020-07-11 20:23:19

是的,这可以通过Flink来完成。而且CEP和SQL也没有帮助,因为它们要求模式在编译时是已知的。

对于事件流,我建议通过id对此流进行键控,并将属性/值数据存储在键控MapState中,这是一种键控状态,Flink知道如何在必要时管理、检查点、恢复和重新缩放。这为我们提供了一个分布式映射,将id映射到保存每个id的数据的散列映射。

对于控制流,让我首先描述一个简化版本的解决方案,其中控制查询的形式为

代码语言:javascript
复制
(id == key) && (attr == value)

我们可以简单地通过查询中的id (即键)来键控该流,并将该流连接到事件流。我们将使用RichCoProcessFunction来保存上面描述的MapState,当这些查询到达时,我们可以查看有哪些数据用于key,并检查是否为map[attr] == value

来处理更复杂的查询,如问题中的查询

代码语言:javascript
复制
(id1 == key1 && attr1 == value1) OR (id2 == key2 && attr2 == value2)

我们可以做一些更复杂的事情。

在这里,我们需要为每个控件查询分配一个唯一的id。

一种方法是将这些查询广播到再次持有上述MapState的KeyedBroadcastProcessFunction。在processBroadcastElement方法中,每个实例都可以使用applyToKeyedState来检查该实例存储键值状态的查询组件的有效性(从even流中的数据字段派生的attr/value对)。对于查询的每个键控组件,实例可以提供所请求的信息,它向下游发出一个结果。

然后,在KeyedBroadcastProcessFunction之后,我们通过控制查询id对流进行键控,并使用KeyedProcessFunction将来自KeyedBroadcastProcessFunction的各种实例的所有响应组合在一起,并确定控制/查询消息的最终结果。

这里没有必要使用广播,但我发现这个方案更容易解释。但是,您可以将查询的键控副本仅路由到包含控制查询中使用的键的MapState的RichCoProcessFunction实例,然后对最终结果执行相同类型的汇编。

这可能很难理解。我提出的建议涉及到组合我以前在示例中编写的两种技术:https://github.com/alpinegizmo/flink-training-exercises/blob/master/src/main/java/com/ververica/flinktraining/solutions/datastream_java/broadcast/TaxiQuerySolution.java是一个使用广播触发跨键控状态的查询谓词求值的示例,而https://gist.github.com/alpinegizmo/5d5f24397a6db7d8fabc1b12a15eeca6是一个使用唯一id在并行执行多个丰富之后重新组装单个响应的示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62836719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档