2014-09-30 61 views
2

我創建了一個卡桑德拉分貝這樣的:Cassandra C#插入似乎是刪除之前的數據?

cqlsh:timeseries> describe keyspace timeseries; 

CREATE KEYSPACE timeseries WITH replication = { 
    'class': 'SimpleStrategy', 
    'replication_factor': '1' 
}; 

USE timeseries; 

CREATE TABLE option_data (
    ts timestamp, 
    ask decimal, 
    bid decimal, 
    expiry timestamp, 
    id text, 
    strike decimal, 
    symbol text, 
    PRIMARY KEY ((ts)) 
) 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 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#函數:

public void InsertUnderlying(long timestamp, string symbol, decimal bid, decimal ask) 
     { 
      var batchStmt = new BatchStatement(); 
      var v2Insert = new SimpleStatement("insert into underlying_data " + 
       "(ts, symbol, bid, ask) values(?, ?, ?, ?);"); 
      batchStmt.Add(v2Insert.Bind(timestamp, symbol, bid, ask)); 

      session.Execute(batchStmt); 
     } 

我調用這個函數實時添加數據。但是,當我從CQL執行查詢時,即使我已經多次調用此函數,我也只能看到一行。不知道我如何追加數據而不是覆蓋它?

+0

您是否還檢查數據庫的設計和配置? – Pieter21 2014-09-30 17:06:12

+0

我添加了在原始文章中構建cassandra db的方式。 – Ivan 2014-09-30 17:11:34

回答

3

在Cassandra中,主鍵是唯一的。你的表underlying_data僅鍵上symbol列:

PRIMARY KEY ((symbol)) 

這意味着所有插入特定符號將相互覆蓋:

INSERT INTO underlying_data (symbol, ts, ask, bid) VALUES ('SPX',1412102636,3.1,4.0); 
INSERT INTO underlying_data (symbol, ts, ask, bid) VALUES ('SPX',1412102708,3.0,4.4); 
INSERT INTO underlying_data (symbol, ts, ask, bid) VALUES ('SPX',1412102731,2.1,5.0); 

SELECT * FROM underlying_data; 

symbol | ts   | ask | bid 
--------+------------+-----+----- 
    SPX | 1412102731 | 2.1 | 5.0 

要存儲每個INSERT,添加ts到您的主鍵定義:

PRIMARY KEY (symbol, ts) 

此外,卡桑德拉不區分INSERTUPDATE(本質上是「UPSERT」)。雖然語法不同,但它們都完成相同的事情:存儲特定鍵的列值。這意味着您可以插入帶有UPDATE的新記錄,並使用INSERT更新現有記錄。艾克沃克有一篇很好的博客文章描述了這個:How to do an Upsert in Cassandra

+0

謝謝布萊斯。就是這樣。 – Ivan 2014-09-30 19:29:30

+0

沒問題@Ivan,很高興幫助! – Aaron 2014-09-30 19:32:58