Hurtownia danych: Jak wyszukiwać codzienne migawki?

9

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.

Federico Ponzi
źródło
Wygląda na to, że masz porządną strukturę danych. Czy istnieje jakiś konkretny powód, dla którego szukasz rozwiązania bez schematu? Według schematu table definitions/structures
zakładam
Ponieważ nie chcę definiować nowych tabel przed załadowaniem moich zestawów danych. Jasne, jeśli istnieje rozwiązanie, które poradzi sobie z tym problemem, ale wymaga wcześniejszej tabeli, wybrałbym to mimo wszystko.
Federico Ponzi
Codzienne migawki 250 GB? Z tymi wymaganiami? W jaki sposób?
Tom V - spróbuj topanswers.xyz 30.01.2016
Dlaczego codzienne migawki? Ile z 250 GB zmienia się dziennie? Co jest złego w podejściu powoli zmieniających się wymiarów?
dnoeth
Proszę nie myśleć o tym problemie w kontekście hurtowni danych, ale w kwestii zapytań i / lub dużych zbiorów danych. Mam różne codzienne migawki mojej bazy danych i chciałbym znaleźć sposób na ich efektywne zapytanie.
Federico Ponzi

Odpowiedzi:

2

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ć TRIGGERna INSERTlub UPDATEw 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ę, czy UNIONbyłby potrzebny. „Migawka” nie byłaby zaangażowana.

Rick James
źródło
1
Zapytałem, jak przeszukiwać codzienne migawki, mówisz tylko o optymalizacji - pomyślę o tym później. Dzięki
Federico Ponzi,
1
Z migawkami trudno sobie poradzić (moim zdaniem), dlatego starałem się przedstawić sposób rozwiązania „prawdziwego” problemu, zamiast poddawać się trudnym rozwiązaniom. Podsumowanie pozwoli również na znacznie szybsze zapytania.
Rick James
2

Tak więc szukałem nowego typu systemu związanego z Datawarehousing: Data Lake System.

Możesz dowiedzieć się więcej na Wikipedii :

Jezioro danych to metoda przechowywania danych w systemie, która ułatwia kolokację danych w różnych wariantach i formach strukturalnych, zwykle obiektowych obiektach blob lub plikach. Hadoop i platforma AWS S3 mogą być używane do budowy repozytoriów jezior danych.

Federico Ponzi
źródło