/** * 1.按照过滤条件读取数据<br> * 2.按照任务配置里设定的离散化方法,进行离散化<br> * 3.按照任务配置里的时间粒度,对数据进行聚合 * * @param filterCondition 过滤条件 * @param doAggregate 是否按时间对数据进行聚合 * @param doDiscretize 是否考虑离散化 * @return */ private DataItems readInput(String filterCondition, boolean doAggregate, boolean doDiscretize) { String sqlStr = "SELECT 事件发生时间," + task.getMiningObject() + " " + "FROM " + conn.DB_TABLE + " WHERE "; if (task.getFilterCondition().length() > 0) sqlStr += task.getFilterCondition() + " AND "; if (filterCondition != null && filterCondition.length() > 0) sqlStr += filterCondition + " AND "; sqlStr += "1=1 ORDER BY 事件发生时间 asc"; // 按时间先后顺序读取数据 conn.closeConn(); ResultSet rs = conn.sqlQuery(sqlStr); if (rs == null) { return null; } ResultSetMetaData meta = null; int numRecords = 0; try { meta = rs.getMetaData(); int numCols = meta.getColumnCount(); data = new DataItems(); while (rs.next()) { numRecords++; StringBuilder sb = new StringBuilder(); for (int i = 2; i <= numCols; i++) if (rs.getString(i) != null) sb.append(rs.getString(i).trim() + ","); if (sb.length() > 0) { Date d = parseTime(rs.getString(1).trim()); if (d != null) data.add1Data(d, sb.substring(0, sb.length() - 1)); else System.out.println(""); } } rs.close(); } catch (SQLException e) { e.printStackTrace(); } System.out.println("共" + numRecords + "条记录!"); System.out.println("读取完毕:" + data.getLength() + "条记录!"); boolean isNonDouble = !data.isAllDataIsDouble(); // 先进行时间粒度上的聚合 if (doAggregate) data = DataPretreatment.aggregateData( data, task.getGranularity(), task.getAggregateMethod(), isNonDouble); // 再进行离散化(只有数值型才能够离散化,否则应该会报错!) if (doDiscretize) data = DataPretreatment.toDiscreteNumbers( data, task.getDiscreteMethod(), task.getDiscreteDimension(), task.getDiscreteEndNodes()); data.setGranularity(task.getGranularity()); // 设置数据的一些参数,如粒度 String endNodes = data.discreteNodes(); task.setDiscreteEndNodes(endNodes); return data; }
/** * 按照任务配置读取数据,并按照任务配置里的时间粒度,对数据进行聚合 * * @param doAggregate 是否聚合 * @param doDiscretize 是否离散化 * @return */ public DataItems readInput(boolean doAggregate, boolean doDiscretize) { if (UtilsSimulation.instance.isUseSimulatedData()) // 使用 { TextUtils txt = new TextUtils(); txt.setTextPath(task.getSourcePath()); DataItems dataItems = txt.readInput(); boolean isNonDouble = !dataItems.isAllDataIsDouble(); // 离散的或非double型的 if (doAggregate) dataItems = DataPretreatment.aggregateData( dataItems, task.getGranularity(), task.getAggregateMethod(), isNonDouble); if (doDiscretize) dataItems = DataPretreatment.toDiscreteNumbers( dataItems, task.getDiscreteMethod(), task.getDiscreteDimension(), task.getDiscreteEndNodes()); String endNodes = dataItems.discreteNodes(); task.setDiscreteEndNodes(endNodes); return dataItems; } else { Calendar cal = Calendar.getInstance(); cal.set(1, 0, 1, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); Date dStart; Date dEnd; if (task.getDateStart() == null || task.getDateStart().equals(cal.getTime())) dStart = UtilsSimulation.instance.getStartTime(); else dStart = task.getDateStart(); if (task.getDateEnd() == null || task.getDateEnd().equals(cal.getTime())) dEnd = UtilsSimulation.instance.getCurTime(); else dEnd = task.getDateEnd(); if (dEnd.after(UtilsSimulation.instance.getCurTime())) dEnd = UtilsSimulation.instance.getCurTime(); return readInputBetween(dStart, dEnd); } }