Драйвер Datastax Cassandra бросает CodecNotFoundException
точное исключение выглядит следующим образом
com.datastax.водитель.ядро.исключения.CodecNotFoundException: кодек не найден для запрошенной операции: [varchar java.математика.У bigdecimal]
Это версии программного обеспечения, которое я использую Искра 1.5 Datastax-cassandra 3.2.1 CDH 5.5.1
код, который я пытаюсь выполнить, - это программа Spark с использованием Java api, и она в основном считывает данные (csv) из hdfs и загружает их в таблицы cassandra . Я использую Искра-Кассандра-соединитель. Сначала у меня было много проблем с конфликтом библиотеки guava google s, который я смог решить, затеняя библиотеку guava и создавая банку snap-shot со всеми зависимостями.
однако я смог загрузить данные для некоторых файлов, но для некоторых файлов я получаю исключение кодека . Когда я исследовал эту проблему, я получил следующие темы на том же вопрос.
https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/yZyaOQ-wazk
https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/yZyaOQ-wazk
после прохождения этого обсуждения я понимаю, что это либо неправильная версия драйвера cassandra, которую я использую . Или по-прежнему существует проблема пути к классу, связанная с библиотекой guava как cassandra 3.0 и более поздних версий версии используют guava 16.0.1, и обсуждения выше говорят, что может быть более низкая версия guava, присутствующая в пути класса .
здесь пом.xml-файл
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.datastax.spark</groupId>
<artifactId>spark-cassandra-connector-java_2.10</artifactId>
<version>1.5.0-M3</version>
</dependency>
<dependency>
<groupId>org.apache.cassandra</groupId>
<artifactId>cassandra-clientutil</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<relocations>
<relocation>
<pattern>com.google</pattern>
<shadedPattern>com.pointcross.shaded.google</shadedPattern>
</relocation>
</relocations>
<minimizeJar>false</minimizeJar>
<shadedArtifactAttached>true</shadedArtifactAttached>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
и это зависимости, которые были загружены с помощью вышеуказанного pom
spark-core_2.10-1.5.0.jar
spark-cassandra-connector- java_2.10-1.5.0-M3.jar
spark-cassandra-connector_2.10-1.5.0-M3.jar
spark-repl_2.10-1.5.1.jar
spark-bagel_2.10-1.5.1.jar
spark-mllib_2.10-1.5.1.jar
spark-streaming_2.10-1.5.1.jar
spark-graphx_2.10-1.5.1.jar
guava-16.0.1.jar
cassandra-clientutil-3.2.1.jar
cassandra-driver-core-3.0.0-alpha4.jar
выше приведены некоторые из основных зависимостей в моей банке snap-shot.
Y является CodecNotFoundException ? Это из-за пути класса (guava) ? или Кассандра-водитель (cassandra-driver-core-3.0.0-alpha4.jar для datastax cassandra 3.2.1) или из-за кода .
другой момент-это все даты, которые я вставляю в столбцы, тип данных которых-отметка времени .
также, когда я делаю spark-submit, я вижу путь класса в журналах , есть другие версии guava, которые находятся под библиотеками hadoop . R это вызывает проблему ?
как мы указываем путь к определенному пользователем классу, когда делаем spark-submit. Это поможет ?
был бы рад получить некоторые очки по этим. Спасибо
следование stacktrace
com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [timestamp <-> java.lang.String]
at com.datastax.driver.core.CodecRegistry.notFound(CodecRegistry.java:689)
at com.datastax.driver.core.CodecRegistry.createCodec(CodecRegistry.java:550)
at com.datastax.driver.core.CodecRegistry.findCodec(CodecRegistry.java:530)
at com.datastax.driver.core.CodecRegistry.codecFor(CodecRegistry.java:485)
at com.datastax.driver.core.AbstractGettableByIndexData.codecFor(AbstractGettableByIndexData.java:85)
at com.datastax.driver.core.BoundStatement.bind(BoundStatement.java:198)
at com.datastax.driver.core.DefaultPreparedStatement.bind(DefaultPreparedStatement.java:126)
at com.cassandra.test.LoadDataToCassandra.call(LoadDataToCassandra.java:223)
at com.cassandra.test.LoadDataToCassandra.call(LoadDataToCassandra.java:1)
at org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction.apply(JavaPairRDD.scala:1027)
at scala.collection.Iterator$$anon.next(Iterator.scala:328)
at org.apache.spark.util.Utils$.getIteratorSize(Utils.scala:1555)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1121)
at org.apache.spark.rdd.RDD$$anonfun$count.apply(RDD.scala:1121)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1850)
at org.apache.spark.SparkContext$$anonfun$runJob.apply(SparkContext.scala:1850)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:88)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Я получил
com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [Math.BigDecimal <-> java.lang.String]
2 ответов
когда вы называете bind(params...)
на PreparedStatement
драйвер ожидает, что вы предоставите значения с типами java, которые сопоставляются с типами cql.
эта ошибка ([timestamp <-> java.lang.String]
) говорит вам, что нет такого зарегистрированного кодека, который отображает java String
в cql timestamp
. В драйвере java timestamp
тип карты java.util.Date
. Поэтому у вас есть 2 варианта:
- где столбец привязывается для метки времени, укажите
Date
- введенное значение вместо aString
. - создайте кодек, который отображает
timestamp <-> String
. Для этого вы можете создать подклассMappingCodec
в соответствии с документация, который сопоставляет строку с timestamp:
public class TimestampAsStringCodec extends MappingCodec<String, Date> {
public TimestampAsStringCodec() { super(TypeCodec.timestamp(), String.class); }
@Override
protected Date serialize(String value) { ... }
@Override
protected String deserialize(Date value) { ... }
}
вам тогда нужно будет зарегистрировать кодек:
cluster.getConfiguration().getCodecRegistry()
.register(new TimestampAsStringCodec());
лучшее решение предоставляется здесь
правильные сопоставления, которые драйвер предлагает из коробки для временных типов:
DATE <-> com.datastax.driver.core.LocalDate : use getDate()