Datastax Cassandra Driver throwing CodecNotFoundException

L'Exception exacte est la suivante

com.datastax.pilote.core.exception.CodecNotFoundException: Codec pas trouvé pour l'opération demandée: [varchar java.mathématique.BigDecimal]

ce sont les versions du logiciel que j'utilise Étincelle de 1,5 Datastax-cassandra 3.2.1 CDH 5.5.1

le code que j'essaie d'exécuter est un programme Spark qui utilise l'api java et qui lit les données (csv) des hdfs et les charge dans les tables de cassandra . Je suis l'aide de la connecteur spark-cassandra. J'ai eu beaucoup de problèmes concernant le conflit de bibliothèque google s guava initialement que j'ai été en mesure de résoudre en ombrageant la bibliothèque guava et la construction d'un bocal snap-shot avec toutes les dépendances.

cependant j'ai été capable de charger des données pour certains fichiers mais pour certains fichiers j'obtiens l'Exception Codec . Quand j'ai fait des recherches sur cette question j'ai obtenu ces fils suivants sur le même question.

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

après avoir passé en revue ces discussions, ce que j'ai compris, c'est qu'il s'agit soit d'une mauvaise version du pilote cassandra que j'utilise . Ou il y a encore un problème de chemin de classe lié à la bibliothèque de goyave comme cassandra 3.0 et plus tard les versions utilisent la goyave 16.0.1 et les discussions ci-dessus indiquent qu'il pourrait y avoir une version plus basse de la goyave présente dans le chemin de classe .

Ici est pom.fichier 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>

et ce sont les dépendances qui ont été téléchargés à l'aide de la 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

ci-dessus sont quelques-unes des principales dépendances dans mon bocal snap-shot.

Y est le CodecNotFoundException ? Est-ce à cause du chemin de classe (goyave) ? ou cassandra-pilote (cassandra-pilote-core-3.0.0-alpha4.jar pour datastax cassandra 3.2.1) ou à cause du code .

un autre point est toutes les dates que j'insère dans les colonnes dont le type de données est timestamp .

aussi quand je fais une spark-submit je vois le chemin de classe dans les logs , il y a d'autres versions de guava qui sont sous les libs de hadoop . R ces à l'origine du problème ?

Comment spécifier l'utilisateur du chemin de classe, alors que faire une étincelle soumettre. Cela aidera ?

serais heureux d'obtenir quelques points sur ces. Merci

suivant est le 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)

j'ai aussi eu

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [Math.BigDecimal <-> java.lang.String]
7
demandé sur Syed Ammar Mustafa 2016-06-02 13:05:28

2 réponses

quand vous appelez bind(params...) sur un PreparedStatement le pilote s'attend à ce que vous fournissiez des valeurs w/ java types qui correspondent aux types cql.

Cette erreur ([timestamp <-> java.lang.String]) vous dit qu'il n'y a pas de Codec enregistré pour cartographier le java String pour un cql timestamp. Dans le pilote java, le timestamp tapez maps to java.util.Date. Si vous avez 2 possibilités:

  1. lorsque la colonne à relier est pour un timestamp, fournir un Date-valeur dactylographiée au lieu d'une String.
  2. Créer un codec cartes timestamp <-> String. Pour ce faire, vous pourriez créer une sous-classe de MappingCodec comme décrit sur le site de documentation, que les cartes de Chaîne d'horodatage:
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) { ... }
}

vous devez alors enregistrer le Codec:

cluster.getConfiguration().getCodecRegistry()
    .register(new TimestampAsStringCodec());
12
répondu Andy Tolbert 2017-03-08 18:49:45

une meilleure solution est fournie ici

les correspondances correctes que le pilote offre hors de la boîte pour les types temporels sont:

    DATE      <-> com.datastax.driver.core.LocalDate : use getDate()
0
répondu NGR 2017-08-04 03:07:01