2017-08-09 59 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」,該語句將按順序返回屬性名稱。