Data Warehouse: Wie kann ich tägliche Schnappschüsse abfragen?

9

Ich habe einige Schnappschüsse einer Datenbank, die keine Zeitreihen sind. Zum Beispiel:

  • Schnappschuss Tag 1:

    +----+---------------+------------+------------+        
    | ID |     Title     |  Category  |    Date    |
    +----+---------------+------------+------------+
    | 1  | My First Post | helloworld | 2015-01-01 |
    +----+---------------+------------+------------+
    
  • Schnappschuss Tag 2 (Ein neuer Beitrag wurde heute hinzugefügt):

    +----+----------------+------------+------------+        
    | ID |      Title     |  Category  |    Date    |
    +----+----------------+------------+------------+
    | 1  | My first post  | helloworld | 2015-01-01 |
    | 2  | My second post | other      | 2015-01-02 |
    +----+----------------+------------+------------+
    
  • Schnappschuss Tag 3 (Post 2 wird heute entfernt):

    +----+---------------+------------+------------+        
    | ID |     Title     |  Category  |    Date    |
    +----+---------------+------------+------------+
    | 1  | My First Post | helloworld | 2015-01-01 |
    +----+---------------+------------+------------+
    

Zwischen den Tagen kann eine Zeile der Tabelle also konstant sein oder nicht. Jetzt muss ich in der Lage sein, eine Abfrage wie diese zu verwenden:

SELECT category, COUNT(*) from day1.My_table group by category

Dies ist für einen Tisch eines Tages. Wenn wir den täglichen Durchschnitt der Beiträge nach Kategorien in einem Monat zählen möchten, sollten wir Folgendes tun:

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

Ein weiteres Beispiel ist die Anzahl der in einem Monat veröffentlichten Beiträge :

SELECT COUNT(distinct id) 
from ( 
    SELECT id 
    from day1.My_table 
    UNION ALL ... 
    UNION ALL SELECT id 
              from day30.My_table
) 

Grundsätzlich müssten wir ein Gewicht berücksichtigen. Wenn wir Tag1.Meine_Tabelle und Tag5.Meine_Tabelle haben, wird jeder Beitrag, der sich in Tag1 und nicht in Tag5 befindet, wie auch in Tag 2,3,4 gezählt. Jeder Beitrag, der Tag1 und Tag5 ist, zählt so, als wäre er an jedem Tag des Monats (= bis zum nächsten Schnappschuss).

Wenn ich also die durchschnittliche Anzahl von Posts pro Tag von> = 6 Monaten pro Tag berücksichtigen möchte, bei denen ich nur 1 Snapshot habe, würde ich diesem Snapshot ein Gewicht von 30 zuweisen.

Der durchschnittliche Beitrag, der in einem Monat für einen Bereich> = 6 Monate veröffentlicht wurde, lautet:

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;

Wie auch in einem Kommentar angegeben, müsste ich eine Abfrage durchführen wie:

Select category, AVG(*) 
from [fromRange-toRange].MyTable; 

Für eine extreme Lösung denke ich über die Idee nach, eine Metasprache zu implementieren, damit der zukünftige Benutzer (z. B. Vermarkter) eine solche Abfrage durchführen kann.

Glauben Sie, dass es in Drill eine Möglichkeit gibt, dies ohne die Metasprache zu erreichen? Ich würde dies mit einer rekursiven UDF tun, aber sie können keine Abfragen zurückgeben.

Jeder Schnappschuss hat eine Größe von 250 GB und ich möchte diesen Datensatz mit anderen externen Daten vergleichen können (ich kenne das Schema dieses Datensatzes vorher nicht).

Gibt es eine für Apache Drill geeignete Lösung? Oder gibt es eine andere Lösung für dieses Problem?

Auch jede Metasprache oder jedes Papier zu diesem Problem wird geschätzt.

Bearbeiten: Wir haben keine Transaktionsdaten. Wir haben Daten, die sich zeitlich ändern und hinzugefügt oder entfernt werden können. Aus diesem Grund brauchen wir alltägliche Schnappschüsse. Außerdem wissen wir nicht im Voraus, welche Abfragen ausgeführt werden sollen, sodass wir nicht wissen können, welche Art von Aggregation durchgeführt werden soll. Außerdem hat jede Zeile ungefähr 100 Spalten, und es gibt beispielsweise 250 GB pro Snapshot (MySQL-Tabellen). Wir brauchen auch eine Volltextsuche nach diesen Daten in jeder Zeile an jedem möglichen Tag.

Ein Beispiel für eine Suche könnte sein: "Wie viele Posts befassten sich mit Sometopic?" Es muss also alle Beiträge nach dem Schlüsselwort sometopic durchsuchen. Jeder Schnappschuss kann dieselben Zeilen haben oder nicht. Auch zwei Schnappschüsse könnten den gleichen Beitrag haben, aber leicht modifiziert.

Federico Ponzi
quelle
Es scheint, dass Sie eine anständige Struktur für Ihre Daten haben. Gibt es einen bestimmten Grund, warum Sie nach einer schemafreien Lösung suchen? Nach Schema table definitions/structures
gehe
Weil ich vor dem Laden meiner Datensätze keine neuen Tabellen definieren möchte. Sicher, wenn es eine Lösung gibt, die dieses Problem lösen kann, aber eine Tabelle im Voraus definiert werden muss, würde ich sie trotzdem wählen.
Federico Ponzi
Tägliche Schnappschüsse von 250 GB? Mit diesen Anforderungen? Wie?
Tom V - versuchen Sie topanswers.xyz
Warum tägliche Schnappschüsse? Wie viel von den 250 GB ändert sich pro Tag? Was ist falsch an einem Ansatz, bei dem sich die Dimensionen langsam ändern?
30.
Bitte denken Sie nicht an dieses Problem in Bezug auf Data Warehousing, sondern in Bezug auf die Abfrage und / oder Big Data. Ich habe täglich verschiedene Schnappschüsse meiner Datenbank und möchte diese effektiv abfragen können.
Federico Ponzi

Antworten:

2

Lassen Sie uns über den Tellerrand hinaus denken. Anstatt einen "Schnappschuss" zu haben, erstellen wir ein "Protokoll". Was Sie derzeit haben, ist der "aktuelle" Stand der Dinge; Das Hinzufügen eines "Protokolls" würde den "Verlauf" liefern, aus dem die "verlorenen" Informationen abgeleitet werden könnten.

Ein Weg , um das Protokoll zu implementieren ist eine haben , TRIGGERauf INSERToder UPDATEvon der Tabelle und hat den Auslöser Schreib in die Protokolldatei. Dieses Protokoll ist für Ad-hoc-Abfragen nicht angenehm. Sie haben also einen nächtlichen Job (oder vielleicht stündlich), der die Änderungen für den Tag zusammenfasst - Nettogewinn (oder -verlust) der Anzahl der Beiträge usw. Die Informationen "Tag2" und Die Informationen zum "letzten Monat" können dann recht schnell aus dieser Übersichtstabelle abgeleitet werden. Oder vielleicht eine zweite Zusammenfassungsebene, die angibt, wie der Zustand für jeden Tag war. Ich bezweifle, ob UNIONes nötig wäre. Der "Schnappschuss" wäre nicht beteiligt.

Rick James
quelle
1
Ich habe gefragt, wie man tägliche Schnappschüsse abfragt. Sie sprechen nur von einer Optimierung - ich werde später darüber nachdenken. Vielen Dank
Federico Ponzi
1
Die Schnappschüsse sind (meiner Meinung nach) schwer zu handhaben, daher habe ich versucht, einen Weg zu finden, um das „echte“ Problem zu lösen, anstatt in einer schwierigen Lösung überfordert zu sein. Die Zusammenfassung ermöglicht auch erheblich schnellere Abfragen.
Rick James
2

Was ich also gesucht habe, ist ein neuer Systemtyp, der mit Datawarehousing zusammenhängt: Data Lake System.

Sie können mehr auf Wikipedia erfahren :

Ein Datensee ist eine Methode zum Speichern von Daten in einem System, die das Zusammenstellen von Daten in varianten Schemata und Strukturformen, normalerweise Objektblobs oder Dateien, erleichtert. Mit Hadoop und der AWS S3-Plattform können Data Lake-Repositorys erstellt werden.

Federico Ponzi
quelle