0

Il me donne java.lang.ClassCastException: [Ljava.util.UUID; ne peut pas être casté en [Ljava.lang.String;Postgresql UUID [] à Cassandra: erreur de conversion

Mon travail lit les données d'une table PostgreSQL contenant des colonnes de type user_ids uuid[], de sorte que j'obtiens l'erreur ci-dessus lorsque j'essaie d'enregistrer des données sur Cassandra.

Cependant, la création de cette même table sur Cassandra fonctionne très bien! user_ids list<text>.

Je ne peux pas modifier le type sur la table source, car je lis les données d'un système hérité.

J'ai cherché au point imprimé sur la bûche, la classe org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils.scala

case StringType => 
     (array: Object) => 
     array.asInstanceOf[Array[java.lang.String]] 
      .map(UTF8String.fromString)``` 

Debug view


Stacktrace

Caused by: java.lang.ClassCastException: [Ljava.util.UUID; cannot be cast to [Ljava.lang.String; 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$14.apply(JdbcUtils.scala:443) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$14.apply(JdbcUtils.scala:442) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$13$$anonfun$18.apply(JdbcUtils.scala:472) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$13$$anonfun$18.apply(JdbcUtils.scala:472) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$nullSafeConvert(JdbcUtils.scala:482) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$13.apply(JdbcUtils.scala:470) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$makeGetter$13.apply(JdbcUtils.scala:469) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:330) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anon$1.getNext(JdbcUtils.scala:312) 
at org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73) 
at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) 
at org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32) 
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source) 
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) 
at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:395) 
at org.apache.spark.sql.execution.columnar.InMemoryRelation$$anonfun$1$$anon$1.hasNext(InMemoryRelation.scala:133) 
at org.apache.spark.storage.memory.MemoryStore.putIteratorAsValues(MemoryStore.scala:215) 
at org.apache.spark.storage.BlockManager$$anonfun$doPutIterator$1.apply(BlockManager.scala:1038) 
at org.apache.spark.storage.BlockManager$$anonfun$doPutIterator$1.apply(BlockManager.scala:1029) 
at org.apache.spark.storage.BlockManager.doPut(BlockManager.scala:969) 
at org.apache.spark.storage.BlockManager.doPutIterator(BlockManager.scala:1029) 
at org.apache.spark.storage.BlockManager.getOrElseUpdate(BlockManager.scala:760) 
at org.apache.spark.rdd.RDD.getOrCompute(RDD.scala:334) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:285) 
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 
at org.apache.spark.scheduler.Task.run(Task.scala:108) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:335) 
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:748) 
+0

Peut essayer de lancer array -> array.asInstanceOf [Array [UUID]] puis essayer de convertir ce nouveau tableau en String i.e. newArray.map (_. ToString) –

Répondre

0

Veuillez regarder ici le support de type de données dans CQL.

Vous devriez avoir créé list<uuid> au lieu de list<text> dans votre schéma de table. Le pilote Java ne peut pas gérer cette conversion automatiquement.

Si vous souhaitez utiliser text à la place, veuillez le convertir en String dans votre application avant de l'envoyer au pilote.

+0

Merci! Je vais le faire, mais j'essayais d'utiliser un seul Job pour effectuer ces conversions, et ce type a été créé automatiquement par le pilote. C'est triste mais je vais devoir écrire un travail spécifique pour cette table. Merci encore. –

0

La valeur que vous avez stockée user_id dans la base de données est de type UUID, le même type dans java est de type java.util.UUID. Donc, au lieu d'utiliser java.lang.String, vous devriez utiliser java.util.UUID array ou list et avant de stocker dans cassandra uuid_obj.toString() pour stocker dans Cassandra.