3

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

4

2 回答 2

4

除非明确地重新映射,否则那将不太奏效。您必须从上到下考虑文档的整个结构。它不是字符串序列 - 它是顶级的 JSON 对象/字典,其值是字符串序列的序列。

JSON 对象/字典可以根据字段名称映射到事件类型。所以正如马特的回答所说,像你这样的 JSON 文档需要一个像这样的事件类型

event SomeEventType {
    sequence<sequence<string > > test2;
}

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

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

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

apama.eventMap:
    defaultEventMap: SomeEventType

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

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

如果您最终对分类器或映射器做了任何不重要的事情,我强烈建议您使用“诊断编解码器”来帮助开发分类器或映射器规则。这是一个编解码器,您可以将其放在编解码器链中的任何位置,该编解码器将记录通过它的每个事件,因此您可以通过查看分类/映射之前和之后发生的情况来了解您的规则是如何运行的。您可以在文档中阅读有关它的信息,但通常只需将“- diagnosticCodec”放在您的链中某处即可。在调试连接链时,我发现它绝对是无价的。

于 2018-10-31T13:47:37.797 回答
3

你希望你的事件类型看起来像:

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

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

HTH,马特

于 2018-10-31T13:35:10.647 回答