我在cassandra 3.0上遇到了一个奇怪的行为:
我有下表:
CREATE TABLE table (
id text,
ts text,
score decimal,
type text,
values text,
PRIMARY KEY (id, ts)
) WITH CLUSTERING ORDER BY (ts DESC)
和以下查询(立即返回):
SELECT * FROM keyspace.table WHERE id='someId' AND ts IN ('2017-10-15','2017-10-16','2017-10-17','2017-10-18','2017-10-19','2017-10-20','2017-10-21','2017-10-22','2017-10-23','2017-10-24','2017-10-25','2017-10-26','2017-10-27','2017-10-28','2017-10-29','2017-10-30','2017-10-31','2017-11-01','2017-11-02','2017-11-03','2017-11-04','2017-11-05','2017-11-06');
如果我在IN子句中添加另一天,则响应永远不会出现(即使在10分钟后!!!):
SELECT * FROM keyspace.table WHERE id ='someId'AND ts IN('2017-10-15','2017-10-16','2017-10-17','2017-10-18' , '2017年10月19日', '2017年10月20日', '2017年10月21日', '2017年10月22日', '2017年10月23日', '2017年10月24日',” 2017年10月25' 日, '2017年10月26日', '2017年10月27日', '2017年10月28日', '2017年10月29日', '二○一七年十月三十〇日','2017- 10-31' , '2017年11月1日', '2017年11月2日', '2017年11月3日', '2017年11月4日', '2017年11月5日','2017-11- 06', '2017-11-07' );
'values'列可能包含大的json数据。 cassandra.yaml中有一些标志有一些大小阈值或类似的东西?我想在查询中添加另一天达到某个限制......在cassandra system.log中我没有看到任何与此相关的内容
答案 0 :(得分:1)
如果它在一个节点上而不是另一个节点上成功,那么查询将在少于1个节点的情况下成功使用'条款我猜这是一个内存压力问题。消除查询解析问题'您可以将查询重写为:
SELECT * FROM myTable WHERE id = 'x' AND ts >= '2017-10-15' AND ts <= '2017-11-07';
如果您开始分享数据,则in子句才真正有用。如果您有热点或者您看到1个节点的负载比其他节点高得多,这是一个很好的方法。
要抓取您的数据,您可能希望执行以下操作:
CREATE TABLE table (
id text,
ts text,
score decimal,
type text,
values text,
PRIMARY KEY ((id, ts), type)
) WITH CLUSTERING ORDER BY (type DESC)
您的数据现在将按ID AND day进行分区。您的查询将成为您现在拥有的:
SELECT * FROM myTable WHERE id='x' AND ts in ('2017-01-01')
这将更好地在HDD上分发数据,并允许更好的并行化来自cassandra。 不会修复内存压力问题。要解决此问题,您需要将数据聚合从协调器移动到应用程序层。
这意味着运行N SELECT ... WHERE id='x' and ts = '2017-01-01';
个查询。