CassandraIO: вставка поля даты не работает - PullRequest
1 голос
/ 22 января 2020

Ниже приведен пример определения таблицы Кассандры, которую я имею; CREATE TABLE IF NOT EXISTS test_table ( id int, data_date date, score double, PRIMARY KEY (id) );

Я создал класс TestTable, который расширяет Serializable, а тип данных члена dataDate был определен как com.datastax.driver.core.LocalDate.

Однако, когда я пытаюсь записать эти данные с использованием CassandraIO.write, я сталкиваюсь с ошибкой Caused by: java.io.NotSerializableException: com.datastax.driver.core.LocalDate

Я понимаю эту ошибку, потому что com.datastax.driver.core.LocalDate не реализует Serializable interface

Поэтому я попытался изменить тип данных элемента dataDate на java.time.LocalDate Однако это изменение приводит к ошибке

java.lang.RuntimeException:org.apache.beam.sdk.util.UserCodeException:java.util.concurrent.ExecutionException:
com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [date <-> java.time.LocalDate]

Итак, вопрос в том; если у меня есть столбец с датой типа данных на Кассандре, как мне вставить его, используя Apache Beam's CassandraIO

1 Ответ

1 голос
/ 22 января 2020
Драйвер

Java может работать с LocalDate из Java 8, только если вы добавили банку с дополнительными кодеками и зарегистрировали их - но не ясно, можете ли вы перехватить установление соединения к Cassandra в задании Beam.

Вам необходимо добавить следующую зависимость к pom. xml (настроить версию в соответствии с версией драйвера в Beam):

<dependency>
  <groupId>com.datastax.cassandra</groupId>
  <artifactId>cassandra-driver-extras</artifactId>
  <version>3.8.0</version>
</dependency>

И зарегистрировать код c где-то:

import com.datastax.driver.extras.codecs.jdk8.LocalDateCodec;
import java.time.Instant;

cluster.getConfiguration().getCodecRegistry()
    .register(LocalDateCodec.instance);

Глядя на Beam, похоже, что он использует Achiles, поддерживающий аннотацию @Codec, и уже включает дополнительные кодеки, поэтому вы можете аннотировать свое поле с помощью @Codec(com.datastax.driver.extras.codecs.jdk8.InstantCodec.class).

Если он не поддерживает Achiles, но вместо этого использует Object Mapper из Java драйвера, тогда вы можете использовать после аннотации : @Column(codec = com.datastax.driver.extras.codecs.jdk8.InstantCodec.class)

...