2015-04-15 8 views
1

Мне нужно организовать партию, которая копирует дельту таблицы каждый день. Эта таблица написана, никогда не обновляется. Я использую java с jdbc, и мне интересно, есть ли метаданные или что-то в таблице, которые можно запросить, чтобы получить все строки, добавленные после даты сертификации.Cassandra delta/relative querying


Почему метаданные? Потому что с моей таблица выглядит как:

CREATE TABLE aTable (
    aTable_id timeuuid, 
    ... 
    PRIMARY KEY ((aTable_id)) 
) WITH 
... 

Я не могу поставить timeuuid ключа где положение как:

SELECT * FROM aTable WHERE aTable_id > minTimeuuid(?) 

и функция маркеров, даже если aTable_id правильно упорядоченные дать мне неправильные результаты:

SELECT * FROM aTable WHERE token(aTable_id) > token(minTimeuuid(?)) 

в общем, мой вопрос: как получить aTables новее, чем на определенную дату?

ответ

0

Так что я в конечном итоге с раствором, найденным в Meetup введения Cassandra 3.0.

Помните, что схема была настроена для другого запроса, и ключи не были установлены для запроса дельта.

Цель для меня было запрашивать только обновленную строку из предыдущей партии, и здесь, как я сделал:

  • Создать таблицу индексов, распределяли по дате час (минуты, секунды и Миллис усечены). Эта таблица снабжается индексом gobal из основного стола.
  • В java запросите индекс по часам (loop on a calendar) и выберите основную таблицу с запросом IN.
  • Работа выполнена!
+0

Таким образом, запросы с 'IN' являются решением, Означает ли это, что мы не должны использовать диапазоны в ключах разделов вообще? – Abhidemon

+1

Нет, если вы используете его в режиме реального времени, например, и если это основная цель таблицы, вы должны добавить date_hour в свои ключи раздела. Но если вы занимаетесь аналитикой, например ежедневной дельтой, вы можете использовать индексную таблицу. Не забывайте, что Cassandra не является RDMBS, и вы должны думать о запросе для построения структуры таблицы. Чтобы закончить, я бы сказал, что с новой Cassandra вы можете сделать ее более сексуальной с прямым индексом, но я покончил с проектом, и, увы, я не очень хорошо помню материал cassandra. –

+0

Извините, я думаю, что неправильно понял ваш вопрос. Я думаю, вы не должны этого делать, потому что, если это разрешено, вам придется сканировать всю базу данных. Но я не эксперт. И гораздо проще обрабатывать сторону приложения результата с ограничением (например, по часам), а не диапазоном (больше), даже если выборка в jdbc является удивительной. –

2

В cassandra первичный ключ также является ключом раздела. Нет смысла создавать раздел для каждого timeuuid ... Итак, вы обычно группируете вещи с помощью первичного ключа, а затем используете ключ кластеризации для заказа.

Вот пример, который близок к тому, что я делаю:

create table sensors(
    location varchar, 
    timestamp timeuuid, 
    ... 
    PRIMARY KEY(location, timestamp) 
) WITH CLUSTERING ORDER BY (timestamp DESC) AND ... 

Расположение является ключевым раздела и временной метки ключ кластеризации.

Затем вы можете выбрать, как это:

SELECT * from sensors 
    where location='tarifa' 
    and timestamp > maxTimeuuid('2015-04-15 13:00') 
    and timestamp < minTimeuuid('2015-04-15 15:00'); 
+1

Хороший ответ. Одна из самых распространенных ошибок новичка в моделировании временных рядов (с Cassandra) заключается в попытке упорядочить данные с помощью одного первичного ключа. Ваше решение - это то, что я бы предложил. – Aaron

+0

Да, это то, что все мне говорят, но факт: сделать дельта, я должен запросить все местоположения раньше? Это не очень оптимизировано:/ –

+0

У меня такая же проблема, мой ключ раздела - 'date_hour'. И при запуске 'select * from my_table, где токен (date_hour) Abhidemon

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

  • Нет связанных вопросов^_^