2017-08-09 29 views
0

我是Esper的新手,我正在开发Storm-Esper协作。通过我的主类,我向包含esper的螺栓发送查询,同时esper-bolt发送元组包含结果到打印机bolt.My的问题是,尽管查询的结果是正确的值,属性值不是在正确的顺序。例如,我有一个查询,从试点的表中选择属性:姓名,航空公司和我应该有相同的顺序的结果。但是我得到:姓名,航空公司,姓氏。我已经尝试了所有关于小组的命令。我认为创建事件的时候它必定是埃斯珀的错包含属性值的地图。我将主要类代码和esper螺栓代码粘贴到地图处理的地方。任何想法为什么发生这种情况都是非常值得的!查询结果中Esper-Wrong属性序列

**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); 

结果应该是:源:艾斯波-打印:2,流:CombinedEvent,ID:{},[约翰,雪,汉莎] 相反,我得到:源:艾斯波-打印:2,流:CombinedEvent,ID:{},[约翰,汉莎,雪景]

PSThe toTuple功能只需通过值获取属性值列表串,并将它们放入其中被发射到printerbolt元组。在espebolt代码中有一些评论中的打印,这帮助我看到问题出现在内部创建的地图上。

回答

0

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