Esper-错误的查询结果中的属性序列

时间:2017-08-09 07:05:22

标签: tuples apache-storm esper

我是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内部创建的地图中。

1 个答案:

答案 0 :(得分:0)

默认情况下,Esper会生成Map事件。在设置配置或注释时,可以将其更改为对象数组事件。地图事件使用&#34; HashMap&#34;而不是&#34; LinkedHashMap&#34;。 &#34; HashMap&#34;迭代键值对时没有排序,但占用的内存要少得多。对象数组是有序的。对于有序访问Map事件,有&#34; EventType&#34;您可以从一个语句中获取,该语句按顺序返回属性名称。