在C#中查询Cassandra

本文关键字:Cassandra 查询 | 更新日期: 2023-09-27 18:25:01

我在时间序列密钥空间中有下表:

CREATE TABLE underlying_data (
  symbol text,
  ask decimal,
  bid decimal,
  ts bigint,
  PRIMARY KEY ((symbol))
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.100000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.000000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='99.0PERCENTILE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};
CREATE INDEX underlying_data_ts_idx ON underlying_data (ts);
cqlsh:timeseries>

在插入以下项目后,我尝试从C#查询此表:

static long ninetySeventyTicks = new DateTime(1970, 1, 1).Ticks;
Cluster cluster = Cluster.Builder().AddContactPoint("127.0.0.1").Build();
ISession session = cluster.Connect("timeseries");
RowSet result  = session.Execute("SELECT symbol, ts FROM underlying_data WHERE ts > " 
                + ninetySeventyTicks.ToString() 
                + " and symbol = 'SPX'"
                //+ "AllowFiltering"
                + ";");
            rows = result.GetRows();

但我有一个例外:

Message = "No indexed columns present in by-columns clause with Equal operator"

我从一本关于查询cassandra的书中复制了这个例子。唯一的区别是这本书使用了CQL而不是C#驱动程序。

这是否可行?如果可行,建议的解决方案是什么?

在C#中查询Cassandra

老实说,当涉及到二级索引时,最好的策略是避免使用它们。

通过将ts添加到PRIMARY KEY中,可以很容易地使该查询工作。

PRIMARY KEY (symbol,ts)

这里,symbol是分区密钥,而ts是聚类密钥。这将允许您指定一个symbol,并根据ts的值筛选结果。