У мене є декілька знімків бази даних, які не є таймерами. Наприклад:
Знімок 1-го дня:
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
День знімка 2 (Нова публікація додана сьогодні):
+----+----------------+------------+------------+ | ID | Title | Category | Date | +----+----------------+------------+------------+ | 1 | My first post | helloworld | 2015-01-01 | | 2 | My second post | other | 2015-01-02 | +----+----------------+------------+------------+
День знімка 3 (публікація 2 видалена сьогодні):
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
Отже, між днями ряд таблиці може бути або не бути постійним. Тепер мені потрібно мати можливість використовувати такий запит:
SELECT category, COUNT(*) from day1.My_table group by category
Це за один стіл одного дня. Якщо ми хочемо підрахувати середньоденну кількість повідомлень за категоріями за місяць, ми повинні зробити щось на кшталт:
SELECT category, SUM(cnt) / 30
from (
SELECT category, COUNT(*) as cnt
from day1.My_table
group by category
UNION ALL SELECT category, COUNT(*) as cnt
from day2.My_table
group by category
UNION ALL ...
UNION ALL SELECT category, COUNT(*) as cnt
from day30.My_table
group by category
) group by category
Ще один приклад - кількість публікацій, опублікованих за місяць :
SELECT COUNT(distinct id)
from (
SELECT id
from day1.My_table
UNION ALL ...
UNION ALL SELECT id
from day30.My_table
)
В основному нам потрібно було б врахувати вагу. Якщо у нас є day1.My_table та day5.My_table, кожна публікація, яка знаходиться в day1, а не в day5, буде зарахована так, як це було також у день 2,3,4. Кожна публікація, що є day1 та day5, вважатиметься такою, що є в кожен день місяця (= до наступного знімка).
Тож у випадку, якщо я хотів би врахувати середню кількість публікацій за день> = 6 місяців на годину, де у мене всього 1 знімок, я призначив би цьому знімку вагу 30.
Отже, середня публікація, опублікована за місяць за діапазон> = 6 місяців тому:
SELECT category, SUM(cnt) / 30
from (
SELECT category, COUNT(*)*30 as cnt
from day1.My_table
group by category --- Note: I'm not considering the range defined from the user in this example.
) group by category;
Як також зазначалося в коментарі, мені потрібно буде зробити запит на зразок:
Select category, AVG(*)
from [fromRange-toRange].MyTable;
Для надзвичайного рішення я розглядаю ідею впровадження метамовлення, щоб майбутні користувачі (колишні люди з маркетингу) могли робити такий запит.
Як ви вважаєте, чи є спосіб досягти цього в "Дрилі" без мета-мови? Я б це зробив за допомогою рекурсивного UDF, але вони не можуть повертати запити.
Кожен знімок об’ємом 250 Гб, і я хочу мати можливість порівнювати цей набір даних з іншими зовнішніми даними (заздалегідь не знаю схему цих наборів даних).
Чи є рішення, придатне для свердла Apache? Або є інше рішення цієї проблеми?
Також вдячний будь-який мета-мова або документ про цю проблему.
Редагувати: У нас немає транзакційних даних. У нас є дані, які змінюються в часі і можуть бути додані або видалені; з цієї причини нам потрібні щоденні знімки. Крім того, ми не знаємо заздалегідь запити, які будуть виконуватися, тому ми не можемо знати, який тип агрегації потрібно зробити. Також у кожному рядку є близько 100 стовпців, а на знімку є 250 Гб (таблиці Mysql). Нам також потрібен повнотекстовий пошук цих даних у кожному рядку, у кожен можливий день.
Прикладом пошуку може бути "Скільки публікацій було про щось сотопічне?" Таким чином, він повинен шукати всі повідомлення за сометопічним ключовим словом. Кожен знімок може мати або не мати однакових рядків. Також два знімки можуть мати один і той же пост, але трохи змінені.
table definitions/structures