我是esper的新手,我正在研究storm esper collaboration。通过我的主类,我将查询发送到包含esper的bolt,而esper bolt将包含结果的元组发送到打印机bolt。我的问题是,尽管查询的结果在值方面是正确的,属性值的顺序不正确。例如,我有一个从飞行员表中选择属性的查询:姓名、姓氏、航空公司和我的结果的顺序应该相同get:name,航空公司,姓氏。我尝试了所有关于group by和order by的方法。我想在创建包含属性值的事件Map时一定是esper的错。我将主类代码和esper bolt代码粘贴到处理Map的位置。任何关于为什么会发生这种情况的想法都是非常受欢迎的!
**mainclass**
.addStatements(("insert into pilotStream " +
"select * " +
"from Log.win:time(120 second) A "))
.addStatements(("insert into employeeStream " +
"select * " +
"from Emp.win:time(120 second) A "))
.addStatements(("insert into CombinedEvent "+
"select tick.pilotName as p_name , " +
"tick.pilotSurname as p_surname , " +
"tick.airline as p_airline " +
"from pilotStream.win:time(120 second) as tick, " +
"employeeStream.win:time(120 second) as rom "+
"where tick.airline = rom.employeeAirline "+
))
**espebolt**
Map<String, Object> emap = (Map<String, Object>) newEvent.getUnderlying();
String Event_name = newEvent.getEventType().getName();
//System.out.println(Event_name);
for (Map.Entry<String, Object> entry : emap.entrySet()) {
// String key = entry.getKey();
String val = String.valueOf(entry.getValue()) ;
//System.out.println(key+" :"+val);
//System.out.println(val);
values.add(val);
}
collector.emit(Event_name, toTuple(newEvent, values, false));
values.removeAll(values);
结果应该是:来源:esper-print:2,stream:combinedevent,id:{},[约翰,斯诺,汉莎航空]相反,我get:source:埃斯珀-print:2,流:combinedevent,id:{},[约翰,汉莎航空,斯诺]
p、 totuple函数只是通过字符串的值列表获取属性的值,并将它们放入一个元组中,这个元组被发送到printerbolt。在espebolt代码中,有一些在注解中的打印帮助我看到问题出在esper内部创建的Map中。
1条答案
按热度按时间xpcnnkqh1#
默认情况下,esper生成Map事件。在设置配置或使用注解时,可以将其更改为对象数组事件。Map事件使用“hashmap”而不是“linkedhashmap”。“hashmap”在迭代键值对时没有顺序,但占用的内存要少得多。对象数组已排序。对于Map事件的有序访问,您可以从按顺序返回属性名的语句中获得“eventtype”。