Mam kilka migawek bazy danych, które nie są seriami czasowymi. Na przykład:
Snapshot day 1:
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
Snapshot day 2 (Dzisiaj dodawany jest nowy post):
+----+----------------+------------+------------+ | ID | Title | Category | Date | +----+----------------+------------+------------+ | 1 | My first post | helloworld | 2015-01-01 | | 2 | My second post | other | 2015-01-02 | +----+----------------+------------+------------+
Migawka dzień 3 (Post 2 został dziś usunięty):
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
Pomiędzy dniami rząd tabeli może być stały lub nie. Teraz muszę móc użyć takiego zapytania:
SELECT category, COUNT(*) from day1.My_table group by category
To jest na jeden stół jednego dnia. Jeśli chcemy policzyć dzienną średnią liczby postów według kategorii w miesiącu , powinniśmy zrobić coś takiego:
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
Kolejny przykład, liczba postów opublikowanych w miesiącu :
SELECT COUNT(distinct id)
from (
SELECT id
from day1.My_table
UNION ALL ...
UNION ALL SELECT id
from day30.My_table
)
Zasadniczo musielibyśmy rozważyć wagę. Jeśli mamy dzień1.Mój_tabela i dzień5.Mój_tabela, każdy post, który jest w dniu 1, a nie w dniu 5, będzie liczony, tak jak w dniu 2,3,4. Każdy post, który jest dniem 1 i dniem 5, będzie liczony tak, jakby był w każdym dniu miesiąca (= do następnej migawki).
Więc jeśli chciałbym wziąć pod uwagę średnią liczbę postów dziennie> = 6 miesięcy, gdy mam tylko 1 migawkę, przypisałbym do tej migawki wagę 30.
Przeciętny post opublikowany w ciągu miesiąca dla zakresu> = 6 miesięcy temu to:
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;
Jak stwierdził również komentarz, musiałbym wykonać zapytanie takie jak:
Select category, AVG(*)
from [fromRange-toRange].MyTable;
W przypadku ekstremalnego rozwiązania zastanawiam się nad wdrożeniem metalajęzyka, aby pozwolić przyszłemu użytkownikowi (np. Sprzedawcom) na wykonanie takiego zapytania.
Czy uważasz, że istnieje sposób na osiągnięcie tego w ćwiczeniach bez metajęzyka? Zrobiłbym to przy użyciu rekurencyjnego UDF, ale nie mogą zwrócić zapytań.
Każda migawka ma duże 250 GB i chcę być w stanie porównać te zbiory danych z innymi danymi zewnętrznymi (wcześniej nie znam schematu tych zbiorów danych).
Czy istnieje rozwiązanie odpowiednie dla Apache Drill? Czy istnieje inne rozwiązanie tego problemu?
Doceniany jest także każdy metajęzyk lub artykuł na temat tego problemu.
Edycja: Nie mamy danych transakcyjnych. Mamy dane, które zmieniają się w czasie i można je dodawać lub usuwać; z tego powodu potrzebujemy codziennych migawek. Nie wiemy też z góry, jakie zapytania będą wykonywane, więc nie wiemy, jaki rodzaj agregacji należy wykonać. Również każdy wiersz ma około 100 kolumn, a na migawkę przypada 250 GB (tabele MySQL). Potrzebujemy również wyszukiwania pełnotekstowego tych danych w każdym wierszu, każdego możliwego dnia.
Przykładem wyszukiwania może być „Ile postów dotyczyło czegoś?” Musi więc przeszukać wszystkie posty w poszukiwaniu jakiegoś słowa kluczowego. Każda migawka może mieć te same wiersze. Również dwie migawki mogą mieć ten sam post, ale nieco zmodyfikowane.
źródło
table definitions/structures
Odpowiedzi:
Pomyślmy po wyjęciu z pudełka. Zamiast mieć „migawkę”, zróbmy „dziennik”. To, co obecnie masz, to „obecny” stan rzeczy; dodanie „dziennika” zapewniłoby „historię”, z której można by uzyskać informacje o „zagubionych”.
Jednym ze sposobów realizacji dziennik jest mieć
TRIGGER
naINSERT
lubUPDATE
w tabeli i mają zapis wyzwalania do pliku dziennika. Ten dziennik nie będzie przyjemny dla zapytań ad hoc, więc miej nocną pracę (a może co godzinę), która podsumowuje zmiany w ciągu dnia - zysk netto (lub utratę) liczby postów itp. Informacje o „day2” i informacje o „ostatnim miesiącu” można następnie dość szybko uzyskać z tej tabeli podsumowań. A może drugi poziom podsumowania, który deklaruje stan każdego dnia. Wątpię, czyUNION
byłby potrzebny. „Migawka” nie byłaby zaangażowana.źródło
Tak więc szukałem nowego typu systemu związanego z Datawarehousing: Data Lake System.
Możesz dowiedzieć się więcej na Wikipedii :
źródło