Сопоставление json с событиями apama

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

3
0
191
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы хотите, чтобы ваш тип мероприятия выглядел так:

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

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

HTH, Мэтт

Ответ принят как подходящий

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

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

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

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

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

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

apama.eventMap:
    defaultEventMap: SomeEventType

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

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

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

Другие вопросы по теме