我在cassandra中的表格有问题。以下是我的工作:
CREATE KEYSPACE tfm WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1 };
我在一台机器上工作。
CREATE TABLE tfm.foehis(hocpny text, hocol text,honumr text,holinh text,hodtto text,hotour text,hoclic text, hooe text,hotpac text,hodtac text,hohrac text,hodesf text,hocdan text,hocdrs text,hocdsl text, hoobs text,hotdsc text,honrac text,holinr text,housca text,hodtea text,hohrea text,housea text,hodtcl text,hohrcl text,houscl text,hodtrc text,hohrrc text,housrc text,hodtra text,hohrra text,housra text,hodtcm text,hohrcm text,houscm text,hodtua text,hohrua text,houser text, PRIMARY KEY((hooe,hodtac,hohrac),hoclic));
到此为止,一切正常。但是,当我尝试执行一些选择查询时,会收到警告和错误:
cqlsh> select count(*) from tfm.foehis;
count
-------
56980
(1 rows)
Warnings :
Aggregation query used without partition key
Read 100 live rows and 1055 tombstone cells for query SELECT * FROM tfm.foehis LIMIT 100 (see tombstone_warn_threshold)
Read 100 live rows and 1066 tombstone cells for query SELECT * FROM tfm.foehis WHERE token(hooe, hodtac, hohrac) >= token(1045161613, 20180502, 2304) LIMIT 100 (see tombstone_warn_threshold)
cqlsh> select count(*) from tfm.foehis where hoclic=1011;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid INTEGER constant (1011) for "hoclic" of type text"
cqlsh> select count(*) from tfm.foehis where hotpac=ANOE;
SyntaxException: line 1:49 no viable alternative at input ';' (...from tfm.foehis where hotpac=[ANOE];)
我以为问题出在表的定义中,但我不知道问题出在哪里。
答案 0 :(得分:0)
select count(*) from tfm.foehis;
时,Cassandra将尝试查找所有分区以计算计数。指向查询时,Cassandra效果最好,因此发出警告。hoclic
列定义为文本,并尝试使用整数值进行搜索。答案 1 :(得分:0)
首先避免选择需要全表扫描的查询。由于性能会受到影响,因为cassandra需要在所有分区上进行扫描。
1)select count(*) from tfm.foehis where hoclic=1011;
这里提供的值是错误的,因为hoclic是文本类型。以下是更正:
select count(*) from tfm.foehis where hoclic='1011';
2)select count(*) from tfm.foehis where hotpac=ANOE
我不认为hotpac是主键的一部分。需要Cassandra在基于参数的搜索中提供分区键。
答案 2 :(得分:0)
实际上,您的问题出在查询中。由于所有列都是文本,因此您需要在值周围使用简单的引号。
此外,根据您的表定义,分区键由hooe,hodtac,hohrac列构成,这意味着所有查询都必须包含具有精确值(=)的该列。 hoclic将成为集群列,在这一列上,您将可以使用其他运算符和排序。
此外,请记住,不建议在Cassandra中运行不带分区键的查询(如您的选择),因为这将触发完整的群集扫描,并且您可能会遇到各种问题(例如,垃圾回收问题)
我建议您阅读一些基本内容:https://www.datastax.com/dev/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key和https://docs.datastax.com/en/cql/3.3/index.html