Scala:从 scylla 读取数据引发异常

Posted

技术标签:

【中文标题】Scala:从 scylla 读取数据引发异常【英文标题】:Scala: Reading data from scylla throws exception 【发布时间】:2021-07-08 21:37:06 【问题描述】:

我是 scala 的新手,我想运行一个简单的查询来从 scylla 中检索一些数据。这是我的代码:

val my_name = "test"
val cluster = ScyllaConnector.getCluster(clusterIpString, scyllaPreferredDc, scyllaUsername, scyllaPassword)
val session = cluster.connect(keySpace)
val preparedStatement: PreparedStatement = session.prepare(GOID_QUERY)
val nameResults = session.execute(preparedStatement.bind(my_name))
val nameResult = nameResults.one()
if(nameResult != null)
  println("Here")
  val id_recent = nameResult.getSet("id_recent",  classOf[String])
  println(id_recent)

session.close()
cluster.close()

投掷:

线程“main”中的异常 com.datastax.driver.core.exceptions.CodecNotFoundException:编解码器不是 找到请求的操作:[varchar java.util.Set] 在 com.datastax.driver.core.CodecRegistry.notFound(CodecRegistry.java:679) 在 com.datastax.driver.core.CodecRegistry.createCodec(CodecRegistry.java:526) 在 com.datastax.driver.core.CodecRegistry.findCodec(CodecRegistry.java:506) 在 com.datastax.driver.core.CodecRegistry.access$200(CodecRegistry.java:140) 在 com.datastax.driver.core.CodecRegistry$TypeCodecCacheLoader.load(CodecRegistry.java:211) 在 com.datastax.driver.core.CodecRegistry$TypeCodecCacheLoader.load(CodecRegistry.java:208) 在 shadeio.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527) 在 shadeio.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2319) 在 shadeio.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2282) 在 shadeio.common.cache.LocalCache$Segment.get(LocalCache.java:2197) 在 shadeio.common.cache.LocalCache.get(LocalCache.java:3937) 在 shadeio.common.cache.LocalCache.getOrLoad(LocalCache.java:3941) 在 shadeio.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824) 在 com.datastax.driver.core.CodecRegistry.lookupCodec(CodecRegistry.java:480) 在 com.datastax.driver.core.CodecRegistry.codecFor(CodecRegistry.java:448) 在 com.datastax.driver.core.AbstractGettableByIndexData.codecFor(AbstractGettableByIndexData.java:73) 在 com.datastax.driver.core.AbstractGettableByIndexData.getSet(AbstractGettableByIndexData.java:318) 在 com.datastax.driver.core.AbstractGettableData.getSet(AbstractGettableData.java:26) 在 com.datastax.driver.core.AbstractGettableByIndexData.getSet(AbstractGettableByIndexData.java:307) 在 com.datastax.driver.core.AbstractGettableData.getSet(AbstractGettableData.java:26) 在 com.datastax.driver.core.AbstractGettableData.getSet(AbstractGettableData.java:215) 在 class.path$.main(CodeName.scala:184) 在 class.path.main(CodeName.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52) 在 org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:845) 在 org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:161) 在 org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:184) 在 org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86) 在 org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:920) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:929) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我确信问题出现在getSet 行,它要求classOf[String],但我不确定用什么替换它。

这是我的表定义:

-- auto-generated definition
create table name_table
(
    name       text,
    id_recent  text,
    primary key (name)
)

【问题讨论】:

【参考方案1】:

您的类型不兼容 - 您在数据库中有 text 类型,但您试图将其作为一组字符串检索([varchar <-> java.util.Set<java.lang.String>] 消息直接说明了这一点)。

getSet替换成getString,如果你需要一个集合,那么你需要从检索到的字符串中自己构造它

【讨论】:

以上是关于Scala:从 scylla 读取数据引发异常的主要内容,如果未能解决你的问题,请参考以下文章

如果我将偏移量设置为非零,则在使用 hyperslab 从 HDF5 文件中读取数据时出现异常

windows中Read函数引发数据异常的问题

Qt 5.5 和 OpenGL:尝试调用 paintGL() 时引发读取访问冲突异常

使用 scala 从 HDFS 读取输入 xml 数据

读取大型 .accdb 文件引发异常“现有连接被远程主机强行关闭”

如果设置了 GD 标志,读取调试寄存器是不是会引发异常?