我是Esper的新手,我正在开发Storm-Esper协作。通过我的主类,我向包含esper的螺栓发送查询,而esper-bolt将包含结果的元组发送到打印机bolt.My问题是,尽管查询的结果与值相同是正确的,但属性值的顺序不正确。例如,我有一个查询从导频表中选择属性:name,surname,航空公司和我应该得到相同的顺序。但是我得到:姓名,航空公司,姓氏。我已经尝试了所有关于分组和排序的事项。我想在创建事件时它必须是Esper的错误&# 39;包含属性值的地图。我将主类代码和esper螺栓代码粘贴到处理地图的地方。任何想法为什么会发生这种情况最受欢迎!
**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);
结果应为:source:Esper-Print:2,stream:CombinedEvent,id:{},[John,Snow,Lufthansa] 相反,我得到:来源:Esper-Print:2,stream:CombinedEvent,id:{},[John,Lufthansa,Snow]
PST toTuple函数只是通过 values 字符串列表获取属性的值,并将它们放入一个发送到printerbolt的元组中。在espebolt代码中有一些打印在注释中帮助我看到问题出现在esper内部创建的地图中。
答案 0 :(得分:0)
默认情况下,Esper会生成Map事件。在设置配置或注释时,可以将其更改为对象数组事件。地图事件使用&#34; HashMap&#34;而不是&#34; LinkedHashMap&#34;。 &#34; HashMap&#34;迭代键值对时没有排序,但占用的内存要少得多。对象数组是有序的。对于有序访问Map事件,有&#34; EventType&#34;您可以从一个语句中获取,该语句按顺序返回属性名称。