2015-05-28 7 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 на помощь!

Если у вас есть дб схему так:

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 

Чтобы получить последние song_id для фиксированного artist_id, вы можете запустить запрос типа:

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

Это работает в разделе, но OP заявляет в комментариях, что желаемое поведение заключается в том, чтобы получить «последнюю запись» во всем кластере (все разделы). Хотя я думаю, что использование TimeUUID является хорошим предложением в этом случае, чтобы получить желаемое поведение, нужно предположить/enusre, что значения генерируются правильно, последовательно и что между генерирующими их клиентами не возникает перекос. Это не совсем волшебная пуля. –

+0

Уильям, вы хотите сказать, если все мои узлы будут правильно синхронизированы со временем, то TimeUUID даст мне уникальные и точные результаты, не так ли? – Hitesh

Смежные вопросы