2016-01-07 4 views
1

Я пытаюсь вставить данные из шторма в кассандру. Первоначально он имеет тип строки.Вставить datetime в cassandra

Мой класс Java имеет следующий код:

String insertQuery1 
      = "insert into fault.as_fo_ag_uc (" 
      + "host," 
      + "trigger," 
      + "eventtime,uuiddefault) " 
      + "values(?,?,?,?)";  

BoundStatement boundStatement = new BoundStatement(statement); 
boundStatement.setString(1, dto.getHost()); 
boundStatement.setString(2, dto.getTrigger()); 
Timestamp ts = Timestamp.valueOf(dto.getEventTime()); 
boundStatement.setDate(3, ts); 
boundStatement.setString(4, dto.getUIDDefault()); 

Здесь Ei получаю ошибку, что eventtime имеет тип метки времени. Поскольку я преобразовал в timestamp, но это не работает. Я также попытался с помощью Simple Date Formater форматировать его в дата типа

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,z"); 
boundStatement.setDate(3, new java.sql.Date(df.parse(dto.getEventTime)).getTime())); 

Ошибка «EventTime имеет тип метки времени». Моя версия драйвера cassandra - 2.1.7.

com.datastax.driver.core.exceptions.InvalidTypeException: Значение eventime имеет тип метки времени на com.datastax.driver.core.AbstractGettableByIndexData.checkType (AbstractGettableByIndexData.java:89) ~ [cassandra- driver-core-2.1.7.1.jar :?] на com.datastax.driver.core.AbstractData.setString (AbstractData.java:157) ~ [cassandra-driver-core-2.1.7.1.jar :?] at com.datastax.driver.core.BoundStatement.setString (BoundStatement.java:499) ~ [cassandra-driver-core-2.1.7.1.jar :?] at storm.starter.bolt.CassandraWriterBolt.execute (CassandraWriterBolt. java: 219) [classes/:?] на backtype.storm.topology.BasicBoltExecutor.execute (BasicBoltExecutor.java:50) [storm-core-0.10.0.jar: 0.10.0] на backtype.storm.daemon.executor $ fn__5694 $ tuple_action_fn__5696.invoke (executor.clj: 690) [storm-core-0.10.0.jar: 0.10.0] в backtype.storm.daemon.executor $ mk_task_receiver $ fn__5615.invoke (executor.clj: 436) [storm-core-0.10.0.jar: 0.10.0] at backtype.storm.disruptor $ clojure_handler $ reify__5189.onEvent (disruptor.clj: 58) [storm-core-0.10.0.jar: 0.10 .0] на backtype.storm.utils.DisruptorQueue.consumeBatchToCursor (DisruptorQueue.java:127) [storm-core-0.10.0.jar: 0.10.0] на backtype.storm.utils.DisruptorQueue.consu meBatchWhenAvailable (DisruptorQueue.java:106) [storm-core-0.10.0.jar: 0.10.0] at backtype.storm.disruptor $ consume_batch_when_available.invoke (disruptor.clj: 80) [storm-core-0.10. 0.jar: 0.10.0] at backtype.storm.daemon.executor $ fn__5694 $ fn__5707 $ fn__5758.invoke (executor.clj: 819) [storm-core-0.10.0.jar: 0.10.0] at backtype.storm.util $ async_loop $ fn__545.invoke (util.clj: 479) [storm-core-0.10.0.jar: 0.10.0] at clojure.lang.AFn.run (AFn.java:22) [Clojure-1.6.0.jar :?] на java.lang.Thread.run (Thread.java:745) [: 1.7.0_79]

+0

Просьба отправить полный стек. –

+0

Непонятно также, почему вы создаете объекты 'Timestamp' и' java.sql.Date', когда 'setDate' просто ожидает' java.util.Date'. –

+0

@SotiriosDelimanolis java 2.1.7 не установил функцию Timestamp – kinkajou

ответ

1

setXyz методы BoundStatement, которые ожидают int аргумент интерпретировать это значение как показатель, начиная с 0.

Так что ваш

boundStatement.setString(2, dto.getTrigger()); 

на самом деле пытается установить заполнитель для eventtime столбца в запросе CQL.

Измените ваше заявление, чтобы начать с 0 и перейти к 3.

BoundStatement boundStatement = new BoundStatement(statement); 
boundStatement.setString(0, dto.getHost()); 
boundStatement.setString(1, dto.getTrigger()); 
Timestamp ts = Timestamp.valueOf(dto.getEventTime()); 
boundStatement.setDate(2, ts); 
boundStatement.setString(3, dto.getUIDDefault()); 
+0

Это был момент! – kinkajou

Смежные вопросы