Склад даних: Як я можу запитувати щоденні знімки?


9

У мене є декілька знімків бази даних, які не є таймерами. Наприклад:

  • Знімок 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
vmachan

Тому що я не хочу визначати нові таблиці перед завантаженням наборів даних. Звичайно, якщо є рішення, яке може вирішити цю проблему, але таблиця потреб повинна бути визначена заздалегідь, я все одно обрав би її.
Федеріко Понці

Щоденні знімки в 250 Гб? З тими вимогами? Як?
Том V - спробуйте topanswers.xyz

Чому щоденні знімки? Скільки 250 Гб змінюється на день? Що не так із підходом до повільно змінюваних розмірів?
dnoeth

Будь ласка, не думайте про цю проблему з точки зору зберігання даних, а з точки зору способів запиту та / або великих даних. У мене є різні щоденні знімки моєї бази даних, і я хотів би спосіб їх ефективного запиту.
Федеріко Понці

Відповіді:


2

Давайте подумаємо з коробки. Замість того, щоб мати «знімок», давайте мати «журнал». На даний момент у вас є "поточний" стан речей; додавання "журналу" забезпечить "історію", з якої можна було б отримати "втрачену" інформацію.

Один з способів реалізації Колода мати TRIGGERна INSERTабо UPDATEз таблиці, і є тригер записи в лог - файл. Цей журнал не буде приємним для спеціальних запитів, тому мати нічну роботу (а може і погодинно), яка підсумовує зміни за день - чистий прибуток (або втрата) кількості повідомлень тощо. Інформація про "day2" та Інформація про "останній місяць" може бути отримана з цієї підсумкової таблиці досить швидко. Або, можливо, другий рівень узагальнення, який декларує, якою була держава на кожен день. Сумніваюсь, чи UNIONзнадобиться. "Знімок" не буде задіяний.


1
Я запитав, як запитувати щоденні знімки, ви просто говорите про оптимізацію - я подумаю про це пізніше. Спасибі
Федеріко Понці

1
Знімки важко розібратися (на мою думку), тому я намагався представити спосіб вирішення «реальної» проблеми, замість того, щоб потрапити на сполох у важкому рішенні. Також узагальнення дозволить отримати значно швидші запити.
Рік Джеймс

2

Отже, що я шукав, це новий тип системи, пов’язаний із Datawarehousing: Data Lake System.

Ви можете дізнатися більше у Вікіпедії :

Озеро даних - це метод зберігання даних всередині системи, що полегшує відбір даних у варіантних схемах та структурних формах, як правило, об’єктних блобів або файлів. Hadoop та платформа AWS S3 можуть бути використані для створення сховищ озера даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.