我正在尝试使用连接链中的Mapper编解码器来转换如下所示的JSON对象:
{"test2":[
["column1","column2","column3"],
["16091", "449", "05302018"],
["16092", "705", "05302018"]
]}一种EPL类型。在我看来,这是一系列的序列,所以我用
event test1 {
sequence<string> values;
}
event test2 {
sequence<test1> tests;
}但这给了我错误
Unable to parse event test.1: Incorrect type in get (you asked for map but its' actually list) 我该如何使用Mapper编解码器来达到这个目的?
发布于 2018-10-31 13:47:37
除非显式地重新映射,否则这是行不通的。您必须从上到下考虑文档的整个结构。它不是一个字符串序列-它是一个顶级的JSON对象/字典,其值是一个字符串序列序列。
JSON对象/字典可以基于字段名映射到事件类型。因此,正如Matt的回答所述,像您这样的JSON文档需要一个事件类型,例如
event SomeEventType {
sequence<sequence<string > > test2;
}如果创建与JSON文档结构完全对应的事件类型不合适,则需要使用映射编解码器重新排列JSON文档中的字段,以匹配事件类型中的字段和子字段。或者可能是一个定制的编解码器;我认为Matt是对的,映射器不能完全按照您的要求来做。
此外,由于JSON文档在顶层没有类型,因此需要确保以某种方式定义了事件类型。有多种方法可以做到这一点。
(1)如果这种特定的连接只会向您发送一种类型的事件,则可以在链的顶端使用apama.eventMap主机插件的“apama.eventMap”配置选项。
apama.eventMap:
defaultEventMap: SomeEventType(2)如果它取决于文档的结构,则需要使用分类器编解码器。它可以接收一条通向相关器的消息,并根据字段的内容(或者仅仅是它们的存在)为其分配一个事件类型。您可以在文档中了解到这一点。
(3)传输有时会对发送给相关器的消息进行定义。例如,在通用消息传输的情况下,UM事件的‘标记’将用作类型。这样做可能合适,也可能不合适。
如果您最终使用分类器或映射器做了一些不平凡的事情,我强烈建议使用“诊断编解码器”来帮助开发分类器或映射规则。这是一个编解码器,你可以把它放在编解码链中的任何地方,这样你就可以通过查看分类/映射之前和之后发生的事情来查看你的规则是如何运行的。您可以在文档中阅读到它,但是它通常就像将'- diagnosticCodec‘放在链中的某个地方一样简单。在调试连接链时,我发现它是非常宝贵的。
发布于 2018-10-31 13:35:10
您希望您的事件类型看起来像:
event type1 {
sequence<sequence<string> > data;
}在映射程序中不可能直接转换为类型2/type1 1模式,但是您可以编写自己的编解码器来完成这一任务,或者在EPL中进行后期过滤。
麦特
https://stackoverflow.com/questions/53084274
复制相似问题