Отображение JSON в Apama Events - PullRequest
       12

Отображение JSON в Apama Events

0 голосов
/ 31 октября 2018

Я пытаюсь использовать кодек 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 для этой цели?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Если явно не переназначить, это не будет работать Вы должны рассмотреть всю структуру документа сверху вниз. Это не последовательность строк - это объект / словарь JSON на верхнем уровне, значение которого представляет собой последовательность последовательностей строк.

Объект / словарь JSON может отображаться на тип события на основе имен полей. Поэтому, как сказал ответ Мэтта, для документа JSON, подобного вашему, потребуется тип события, например

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

Если нецелесообразно создавать тип события, который точно соответствует структуре документа JSON, то вам нужно использовать кодек сопоставления, чтобы переупорядочить поля в документе JSON, чтобы они соответствовали полям и подполям в событии. тип. Или, возможно, пользовательский кодек; Я думаю, что Мэтт прав, что картограф не может точно сделать то, что вы хотите.

Кроме того, поскольку документы JSON на верхнем уровне не содержат типов, вам необходимо убедиться, что тип события как-то определен. Есть несколько способов сделать это.

(1) Если это конкретное соединение будет отправлять вам только события одного типа, вы можете использовать опцию конфигурации 'defaultEventType' в плагине хоста apama.eventMap в верхней части цепочки, например

apama.eventMap:
    defaultEventMap: SomeEventType

(2) Если это зависит от структуры документа, вам необходимо использовать кодек классификатора. Это может принять сообщение, идущее к коррелятору, и назначить ему тип события на основе содержимого полей (или просто их наличия). Вы можете узнать об этом в документации.

(3) Транспорт иногда определяет его в сообщениях, отправляемых в коррелятор. Например, в случае транспорта Universal Messaging в качестве типа будет использоваться «тег» события единой системы обмена сообщениями. Это может или не может быть уместным.

Если вы все же сделаете что-нибудь нетривиальное с классификатором или картографом, я настоятельно рекомендую использовать «диагностический кодек», чтобы помочь в разработке правил классификатора или картографа. Это кодек, который вы можете поместить в любом месте в цепочке кодеков, который будет регистрировать каждое событие, проходящее через него, чтобы вы могли увидеть, как работают ваши правила, увидев, что происходит до и после классификации / отображения. Вы можете прочитать об этом в документации, но обычно это так же просто, как поместить куда-нибудь в вашей цепочке '- DiagnostCodec'. Я нашел это абсолютно бесценным при отладке цепочек подключения.

0 голосов
/ 31 октября 2018

вы хотите, чтобы ваш тип события был похож на:

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

Невозможно напрямую преобразовать в схему преобразования в вашу схему type2 / type1, но вы сможете написать собственный кодек для этого или выполнить пост-фильтрацию в EPL.

НТН, Matt

...