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.
quelle
table definitions/structures
Antworten:
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 ,
TRIGGER
aufINSERT
oderUPDATE
von 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, obUNION
es nötig wäre. Der "Schnappschuss" wäre nicht beteiligt.quelle
Was ich also gesucht habe, ist ein neuer Systemtyp, der mit Datawarehousing zusammenhängt: Data Lake System.
Sie können mehr auf Wikipedia erfahren :
quelle