2015-05-28 20 views
3

我們的表中有一個主鍵爲UUID。要獲得最後一條記錄,我們按desc uuid字段排序。但是,因爲這個字段不是整數,所以我們並不總是得到最後的記錄。有沒有辦法獲得最後的記錄?請注意,我們不想製作羣集列。從Cassandra獲取最新插入的數據

這裏是我的表

ArtistId (partition key) | SongId (primary key, uuid) | Song 
-------------------------------------------- 
1       | 9a9fa429-c349-4137   | abc 
1       | 9a9fa429-b349-6137   | cde 
1       | 9a9ga429-a349-6132   | fgh 
2       | 249ga429-a909-6542   | ijk 
2       | 249kg429-a239-3652   | lmn 
1       | i55oa429-a909-3462   | opq 
1       | e4235k59-4ik9-6542   | rst 
+0

你能告訴你的例子表架構和查詢本身? AFAIK沒有正確的方法來通過分區鍵對C *中的行進行排序(因爲OrderedPartitioner總是被認爲是有害的)。 – shutty

+0

我編輯了這個問題來添加示例表,我想要這個查詢會給我表中最後一個插入的記錄。 – Hitesh

+1

Downvoters,請關注爲什麼downvotes評論? – Hitesh

回答

5

TL & DR:TimeUUID cql3類型來救援!

如果你有一個DB模式是這樣的:

create table music (
    artist_id int, 
    song_id timeuuid, 
    song text, 
    primary key (artist_id, song_id) 
) with clustering order by (song_id desc); 

注意這些改變你原來的模式:

  • uuid改爲timeuuid
  • 聚集鍵反向
  • 排序

表包含一些數據吧:

artist_id | dateOf(song_id)   | song 
-----------+--------------------------+------ 
     1 | 2015-05-29 13:25:15+0300 | baz 
     1 | 2015-05-29 13:25:11+0300 | bar 
     1 | 2015-05-29 13:25:06+0300 | foo 
     2 | 2015-05-29 13:25:19+0300 | qux 

要得到一個固定artist_id最新song_id,你可以運行像查詢:

select artist_id,dateOf(song_id),song from music where artist_id=1 limit 1; 
+1

在分區內工作,但OP在評論中聲明,所需的行爲是在整個集羣(所有分區)中獲取「最後一條記錄」。雖然我認爲在這種情況下使用TimeUUID是一個很好的建議,但爲了獲得所需的行爲,必須假設/值得到的是正確生成的值,並且生成它們的客戶端之間沒有時鐘偏移。這不是一個神奇的子彈。 –

+0

威廉,你的意思是說,如果我的所有節點都與時間正確同步,那麼TimeUUID會給我獨特和準確的結果,對嗎? – Hitesh