2017-07-27 3 views
0

私はCassandraを学習しています。v3.8から始めました。私のサンプルキースペース/表には、一意性と分布は、クラスタノード間で行われているように、プロバイダとデバイスIDとしてパーティションキーを持つ複合PRIMARY KEYを使用して、このCassandraクラスタリング列の同じデータフィールドを持つ行を、クエリの挿入で置き換えます。

CREATE TABLE digital.usage (
    provider decimal, 
    deviceid text, 
    date text, 
    hours varint, 
    app text, 
    flat text, 
    usage decimal, 
    PRIMARY KEY ((provider, deviceid), date, hours) 
) WITH CLUSTERING ORDER BY (date ASC, hours ASC) 
    AND bloom_filter_fp_chance = 0.01 
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'} 
    AND comment = '' 
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'} 
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND crc_check_chance = 1.0 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99PERCENTILE'; 

のように見えます。クラスタ化キーは、日付と時間です。時間のフィールドに複数のエントリを挿入しながら、

1)PRIMARY KEY((provider, deviceid), date, hours)の場合のみ、最新のが記録され、以前は姿を消しています

は、私はいくつかobservatonsを持っています。

2)PRIMARY KEY((provider, deviceid), date)の場合、同じ日付フィールドに複数のエントリを挿入している間は、最新のもののみが記録され、前のものは消えます。

私は上記(ポイント-1)の動作に満足していますが、バックグラウンドで起こっていることを知りたいです。クラスタリングの順序キーについてもっと理解する必要がありますか?

答えて

2

PRIMARY KEYは一意であることを意味します。

PRIMARY KEYに重複値を挿入すると、ほとんどのRDBMSでエラーが発生します。

カサンドラは書き込み前に読み取りを行いません。最新のタイムスタンプを持つ新しいバージョンのレコードを作成します。主キーの列に同じ値を持つデータを挿入すると、最新のタイムスタンプで新しいデータが作成され、最新のタイムスタンプのみのクエリ(SELECT)レコードが返されます。

例:迅速な返信用

PRIMARY KEY((provider, deviceid), date, hours) 
Insert into digital.usage(provider, deviceid, date, hours,app,flat) values(1.0,'a','2017-07-27',1,"test","test") 
---- This will create a new record with let's say timestamp as 1 
Insert into digital.usage(provider, deviceid, date, hours,app,flat) values(1.0,'a','2017-07-27',1,"test1","test1") 
---- This will create a new record with let's say timestamp as 2 

SELECT app,flat FROM digital.usage WHERE provider=1.0 AND deviceid='a' AND date='2017-07-27' AND hours=1 

Will give 
------------ 
| app | flat | 
|-----|------| 
|test1|test1 | 
------------ 
+0

感謝。真のプライムキーはユニークなものです。しかし、なぜプライマリキーの最後のフィールドですか?私の質問のポイント-1から、時間が影響を受けます。なぜあまりにも日付? – srikanth

+0

あなたのポイント1とポイント2は同じものです...同じプライマリキー値を持つ複数のエントリを入力すると、最新のもののみが利用可能になります –

+0

同じ日付に異なる時間値を入力すると、すべてが表示されます。 'provider、deviceid、date、hours'からの何も前のレコードと同じ値でなければなりません...もしそれが同じで、最新のタイムスタンプの値よりも勝ったら –

関連する問題