2015-04-28 4 views
2

Я знаю, что здесь есть много вопросов по времени, но мой, похоже, не подходит для этих решений. Я также новичок в Cassandra, поэтому я, возможно, приближаюсь к этому с неправильным мышлением. Потерпите меня.Cassandra Time-Series: Разрешить фильтрование, ведра или другое

Я получаю поиск данных в виде:

datetime_searched, term_used, product_found 

и запрос я хотел бы сделать:

Учитывая стартап дату и конечный срок, вернуть все которые попадают в это окно времени. Первоначально окно будет длиться месяц. Это может (читать: будет) изменяться.

Например, учитывая следующие данные:

2013-11-20 00:00:00, "christmas", "decorated tree" 
2014-12-01 20:00:00, "christmas", "wrapping paper" 
2014-12-23 15:00:00, "christmas", "decorated tree" (duplicate term-product) 

и запрос для временного диапазона 2014-12-01 до 2015-01-01, Я хотел бы иметь возможность получить:

"christmas", "wrapping paper" 
"christmas", "decorated tree" 

Мой первоначальный подход выглядел как и большинство примеров для данных временных рядов:

CREATE TABLE search_terms (
    datetime_searched timestamp, 
    term_used text, 
    product_found text, 
    PRIMARY KEY (term_used, date_searched) 
); 

SELECT term_used, product_found 
FROM search_terms 
WHERE datetime_searched > [start] 
AND datetime_searched < [end]; 

, но для этого требуется, чтобы у меня были вторичные индексы и/или разрешающая фильтрация, что, похоже, я должен избегать, если я только фиксирую небольшой процент фильтруемых данных.

Моя вторая идея заключалась в создании ведра времени, но это решение, похоже, работает, только если я ограничу запрос на ведра. Кажется, он также создает горячие точки - в моем первоначальном случае - месячную горячую точку. Например, для ежедневных ковшей:

CREATE TABLE search_terms_by_day (
    datetime_searched timestamp, 
    day_searched timestamp, 
    term_used text, 
    product_found text, 
    PRIMARY KEY (day_searched) 
); 

SELECT term_used, product_found 
FROM search_terms_by_day 
WHERE day_searched=[my limited query's bucket]; 

Итак, какие у меня варианты? Я ограничиваю свои запросы размером в ковш, возможно, создавая много CF с разными размерами ковша, при создании горячих точек; Я вынужден использовать вторичные индексы; или есть другой вариант, о котором я не знаю?

Заранее спасибо.

ответ

5

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

Существует возможность расчета всех временных ковшей, к которым нам нужно получить доступ, делая запрос для каждого из этих ковшей с фильтром, чтобы захватить нужные нам записи.

CREATE TABLE search_terms_by_day_of_year (
    day_searched int, // 1 - 366 
    datetime_searched timestamp, 
    term_used text, 
    product_found text, 
    PRIMARY KEY (day_searched, datetime_searched, term_used, product_found) 
); 

// Make N of these, with a different day_searched 
SELECT term_used, product_found 
FROM search_terms_by_week 
WHERE day_searched = 51 
AND datetime_searched > [start] 
AND datetime_searched < [end] 

Положительных:

  • ИЗБЕГАЕТ сканирование всех данных поиска
  • позволяет меньшие временные ведра, которые, в свою очередь, уменьшает наши горячие пятна

негативов:

  • Требуется логику для определения ключей разделов, необходимых
  • Там будет точка доступа для записи на период ковша (в приведенном выше примере, один день)
  • Плохой выбор размера ковша по отношению к запросу диапазон потребует просмотра всех ведер, отрицая любые выгоды.
  • Несколько запросов к базе данных. Чем меньше ведро, тем больше звонков требуется.

Пожалуйста, дайте мне знать, если есть лучшее решение этих

+0

Чтобы избежать вопроса о сканировании всех ведер, дата поиска может использоваться вместо дня года –

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