Host replied with server error: java.lang.String cannot be cast to java.util.UUID

Host replied with server error: java.lang.String cannot be cast to java.util.UUID

我正在使用 Datastax 解决方案 (DSE)。

这是 Cassandra 模型:

CREATE TABLE mykeyspace.mytable (
uid uuid,
date_tsp timestamp,
solr_query text,
text_txt text,
PRIMARY KEY (uid, date_tsp)
)

我的 solr schema.xml:

<schema name="mytable" version="1.5">
 <types>
  <fieldType name="uuid" class="solr.UUIDField"/>
  <fieldType name="text" class="solr.TextField"/>
  <fieldType name="date" class="solr.TrieDateField"/>
 </types>

 <fields>
  <field name="uid"  type="uuid" indexed="true"  stored="true" docValues="true"/>
  <field name="date_tsp"  type="date" indexed="true"  stored="true" docValues="true"/>
  <field name="text_txt"  type="text" indexed="true"  stored="true"/>
 </fields>

 <defaultSearchField>text_txt</defaultSearchField>
 <uniqueKey>(uid, date_tsp)</uniqueKey>
</schema>

数据:

insert into mytable (uid, date_tsp, text_txt)
values (75803436-289c-4131-a766-6ba4b7151983, dateof(now()), 'text 1');

insert into mytable (uid, date_tsp, text_txt)
values (75803436-289c-4131-a766-6ba4b7151983, dateof(now()), 'text 2');

insert into mytable (uid, date_tsp, text_txt)
values (75803436-289c-4131-a766-6ba4b7151983, dateof(now()), 'text 3');

insert into mytable (uid, date_tsp, text_txt)
values (uuid(), dateof(now()), 'text 11');

工作 Cassandra 查询(运行 来自 Datastax DevCenter):

SELECT * FROM text_heard WHERE solr_query='*1*';

SELECT uid, date_tsp, text_txt FROM text_heard 
WHERE uid = 75803436-289c-4131-a766-6ba4b7151983;

SELECT date_tsp, text_txt FROM text_heard 
WHERE uid = 75803436-289c-4131-a766-6ba4b7151983 
AND solr_query = 'text_txt:*1*';

但查询(在 SELECT 子句中使用 uid):

SELECT uid, date_tsp, text_txt FROM text_heard 
WHERE uid = 75803436-289c-4131-a766-6ba4b7151983 
AND solr_query = 'text_txt:*1*';

产生错误:

java.lang.ClassCastException: java.lang.String cannot be cast to java.util.UUID
at org.apache.cassandra.serializers.UUIDSerializer.serialize(UUIDSerializer.java:26) ~[cassandra-all-2.1.8.621.jar:2.1.8.621]
at org.apache.cassandra.db.marshal.AbstractType.decompose(AbstractType.java:73) ~[cassandra-all-2.1.8.621.jar:2.1.8.621]
at com.datastax.bdp.search.solr.cql.SinglePassRowResponseHandler.buildCassandraRows(SinglePassRowResponseHandler.java:140) ~[dse-4.7.2.jar:4.7.2]
at com.datastax.bdp.search.solr.cql.SinglePassRowResponseHandler.handle(SinglePassRowResponseHandler.java:49) ~[dse-4.7.2.jar:4.7.2]
at com.datastax.bdp.search.solr.cql.CqlSolrQueryExecutor.handleSolrResponse(CqlSolrQueryExecutor.java:370) [dse-4.7.2.jar:4.7.2]
at com.datastax.bdp.search.solr.cql.CqlSolrQueryExecutor.execute(CqlSolrQueryExecutor.java:134) [dse-4.7.2.jar:4.7.2]
at com.datastax.bdp.cassandra.cql3.SolrOperationFactory$SolrStatementExecution.execute(SolrOperationFactory.java:71) [dse-4.7.2.jar:4.7.2]
at com.datastax.bdp.cassandra.cql3.DseQueryHandler$Operation.executeWithTiming(DseQueryHandler.java:223) [dse-4.7.2.jar:4.7.2]
at com.datastax.bdp.cassandra.cql3.DseQueryHandler$Operation.executeWithAuditLogging(DseQueryHandler.java:259) [dse-4.7.2.jar:4.7.2]
at com.datastax.bdp.cassandra.cql3.DseQueryHandler.process(DseQueryHandler.java:94) [dse-4.7.2.jar:4.7.2]
at org.apache.cassandra.transport.messages.QueryMessage.execute(QueryMessage.java:119) [cassandra-all-2.1.8.621.jar:2.1.8.621]
at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:439) [cassandra-all-2.1.8.621.jar:2.1.8.621]
at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:335) [cassandra-all-2.1.8.621.jar:2.1.8.621]
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-all-4.0.23.Final.jar:4.0.23.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [netty-all-4.0.23.Final.jar:4.0.23.Final]
at io.netty.channel.AbstractChannelHandlerContext.access0(AbstractChannelHandlerContext.java:32) [netty-all-4.0.23.Final.jar:4.0.23.Final]
at io.netty.channel.AbstractChannelHandlerContext.run(AbstractChannelHandlerContext.java:324) [netty-all-4.0.23.Final.jar:4.0.23.Final]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_71]
at org.apache.cassandra.concurrent.AbstractTracingAwareExecutorService$FutureTask.run(AbstractTracingAwareExecutorService.java:164) [cassandra-all-2.1.8.621.jar:2.1.8.621]
at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:105) [cassandra-all-2.1.8.621.jar:2.1.8.621]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71]

这是我的设置问题还是错误?

读取 UUID 类型时存在一个已知问题,该问题已在以下 DSE 版本中修复:4.7.4、4.8.0

Single pass queries do not work with UUID, TimeUUID, Inet, Decimal, and Varint types. (DSP-6443)

见下文DSE4.8 release notes