我正在尝试在连接链中使用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编解码器吗?
答案 0 :(得分:4)
除非明确地重新映射,否则将无法正常工作。您必须从上到下考虑文档的整个结构。它不是字符串序列,而是顶级的JSON对象/字典,其值是字符串序列的序列。
JSON对象/字典可以基于字段名称映射到事件类型。因此,正如马特的回答所说,像您这样的JSON文档将需要一个事件类型,如
event SomeEventType {
sequence<sequence<string > > test2;
}
如果不适合创建与JSON文档的结构完全对应的事件类型,则需要使用映射编解码器重新排列JSON文档中的字段以匹配事件中的字段和子字段类型。或者可能是自定义编解码器;我认为Matt是正确的,因为映射器无法准确地完成您想要的操作。
此外,由于JSON文档在顶层没有类型,因此您需要确保以某种方式定义了事件类型。有多种方法可以做到这一点。
(1)如果此特定连接仅向您发送一个类型的事件,则可以使用链顶部的apama.eventMap主机插件的“ defaultEventType”配置选项。例如
apama.eventMap:
defaultEventMap: SomeEventType
(2)如果取决于文档的结构,则需要使用分类器编解码器。这可以将一条消息发送给相关器,然后根据字段的内容(或仅根据它们的存在)为其分配事件类型。您可以在文档中了解它。
(3)传输有时会在发送到相关器的消息中对其进行定义。例如,对于通用消息传输,则UM事件的“标记”将用作类型。这可能合适,也可能不合适。
如果您最终对分类器或映射器做任何不平凡的事情,我强烈建议您使用“诊断编解码器”来帮助开发分类器或映射器规则。这是一个编解码器,您可以将其放置在编解码器链中的任何位置,该日志将记录通过它的每个事件,因此您可以通过查看分类/映射前后的情况来了解规则的运行方式。您可以在文档中阅读有关它的信息,但这通常很简单,只需将'-diagnosticCodec'放在链中的某个位置即可。我发现调试连接链时绝对无价。
答案 1 :(得分:3)
您希望事件类型如下:
event type1 {
sequence<sequence<string> > data;
}
在映射器中不可能直接转换为您的type2 / type1模式,但是您可以编写自己的编解码器来做到这一点,或者在EPL中进行后过滤。
HTH, 马特