Storm-JDBC 中Date类型转换bug

    xiaoxiao2021-03-26  22

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

    转载请注明原文地址: https://ju.6miu.com/read-658292.html

    最新回复(0)