在Storm-JDBC中SimpleJdbcMapper类下,如果Column的类型为Time,Date,TIMESTAMP的话,默认是取值转换成Long类型的,如下为源码
else if(Util.getJavaType(columnSqlType).equals(Date.class)) { Long value = tuple.getLongByField(columnName); columns.add(new Column(columnName, new Date(value), columnSqlType)); } else if(Util.getJavaType(columnSqlType).equals(Time.class)) { Long value = tuple.getLongByField(columnName); columns.add(new Column(columnName, new Time(value), columnSqlType)); } else if(Util.getJavaType(columnSqlType).equals(Timestamp.class)) { Long value = tuple.getLongByField(columnName); columns.add(new Column(columnName, new Timestamp(value), columnSqlType)); }如果用默认的源码的话,要formate下把Date类型转换成Long不然会报错,错误如下:
java.lang.ClassCastException: java.sql.Date cannot be cast to java.lang.Long
at backtype.storm.tuple.TupleImpl.getLongByField(TupleImpl.java:161) ~[storm-core-0.10.2.jar:0.10.2]
现在提供两种方案:
1.按照源码的规则转换,如时间类型format
private static Date date = new Date();
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
2.重写SimpleJdbcMapper,继承 JdbcMapper接口;如下转换为object类型
else if (Util.getJavaType(columnSqlType).equals(Date.class)) { Object value = tuple.getValueByField(columnName); columns.add(new Column(columnName, value, columnSqlType.intValue())); } else if (Util.getJavaType(columnSqlType).equals(Time.class)) { Object value = tuple.getValueByField(columnName); columns.add(new Column(columnName, value, columnSqlType.intValue())); } else if (Util.getJavaType(columnSqlType).equals(Timestamp.class)) { Object value = tuple.getValueByField(columnName); columns.add(new Column(columnName, value, columnSqlType.intValue())); }