Storm-JDBC 中Date类型转换bug

来源:互联网 发布:c语言volatile的作用 编辑:程序博客网 时间:2024/06/06 17:29

在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()));}


0 0
原创粉丝点击