将 JSON 映射到 Apama 事件

Mapping JSON to Apama Events

我正在尝试在我的连接链中使用 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 编解码器有什么想法吗?

您希望事件类型如下所示:

event type1 {
   sequence<sequence<string> > data;
}

不可能在映射器中直接转换为您的 type2/type1 模式,但您可以编写自己的编解码器来执行此操作或在 EPL 中进行 post 过滤。

HTH, 马特

除非明确地重新映射,否则不会完全有效。您必须从上到下考虑文档的整个结构。它不是字符串序列 - 它是顶层的 JSON object/dictionary,其值是字符串序列的序列。

A JSON object/dictionary 可以映射到基于字段名称的事件类型。因此,正如 Matt 的回答所说,像您这样的 JSON 文档需要像

这样的事件类型
event SomeEventType {
    sequence<sequence<string > > test2;
}

如果创建与 JSON 文档结构完全对应的事件类型不合适,则需要使用映射编解码器重新排列 JSON 文档中的字段以匹配事件类型中的字段和子字段。或者可能是自定义编解码器;我认为 Matt 是对的,映射器不能完全你想要的。

此外,由于 JSON 文档在顶层是无类型的,因此您需要确保以某种方式定义了事件类型。有多种方法可以做到这一点。

(1) 如果此特定连接只会向您发送 一个 类型的事件,您可以使用 apama.eventMap 主机的 'defaultEventType' 配置选项链顶部的插件,例如

apama.eventMap:
    defaultEventMap: SomeEventType

(2) 如果它取决于文档的结构,则需要使用分类器编解码器。这可以将消息传递给相关器,并根据字段的内容(或仅仅是它们的存在)为其分配事件类型。您可以在文档中了解它。

(3) 传输有时会在发送到相关器的消息上定义它。例如,在通用消息传输的情况下,UM 事件的 'tag' 将用作类型。这可能合适也可能不合适。

如果您最终使用分类器或映射器做了一些重要的事情,我强烈建议您使用 'diagnostic codec' 来帮助开发分类器或映射器规则。这是一个编解码器,您可以将其放在编解码器链中的任何位置,它将记录通过它的每个事件,因此您可以通过查看 classification/mapping 之前和之后发生的事情来了解您的规则是如何运作的。您可以在文档中阅读它,但它通常就像将“-diagnosticCodec”放在链中的某个位置一样简单。在调试连接链时,我发现它绝对无价