2012-05-12 7 views
6

Angenommen, dass ich ein ‚Ereignis‘ ein User auf einer Website dauert, können Ereignisse Dinge wie:Berechnung der Trichteranalyse, wie würden Sie einen Trichter berechnen?

  1. angesehen Homepage
  2. zusätzliche Artikel in der Warenkorb
  3. Kasse
  4. für Bestellung bezahlt
  5. Sitzungs_ID:

Nun jeder dieser Ereignisse in einer Datenbank gespeichert, wie event_name created_date ..

So, jetzt möchte ich einen Bericht erstellen einen bestimmten Trichter anzuzeigen, die ich definieren wie:

Step#1 event_n 
Step#2 event_n2 
Step#3 event_n3 

So diese spezielle Trichter 3 Stufen hat, und jeder Schritt wird mit jedem Ereignis zugeordnet .

Wie kann ich einen Bericht für dieses jetzt unter den oben genannten Daten, die ich habe, erstellen?

Hinweis: möchte nur klar sein, ich möchte in der Lage sein, jeden von mir definierten Trichter zu erstellen und einen Bericht dafür erstellen zu können.

Die einfachste Art, wie ich mir vorstellen kann ist:

  1. alle Veranstaltungen für jeden Schritt, den ich in meiner Datenbank
  2. Schritt # 1 wird, x% der Menschen haben bekommen ausgeführt event_n
  3. jetzt werde ich die Daten für Schritt # abfragen muß 2, der auch Schritt # 1 durchgeführt, und die% Anzeige
  4. wie # 3, aber für Schritt # 3 mit der Bedingung für Schritt # 2

Ich bin gespannt, wie diese Online-Dienste diese Art von Berichten in einer gehosteten Saas-Umgebung anzeigen können. Erleichtert map-reduce das irgendwie?

+0

Nun, Sie können alle Ereignisse pro Sitzung ID in einem Reducer bekommen, wenn Sie denken, dass dies einfacher macht. –

Antwort

2

Das Kernproblem in der Art und Weise, wie Sie darüber nachdenken, ist, dass Sie in einem SQL/Tabellentyp-Modell denken. Jedes Ereignis ist ein Datensatz. Eines der netten Dinge über NoSQL-Technologien (zu denen Sie eine Ahnung haben) ist, dass Sie den Datensatz natürlich als eine Sitzung pro Datensatz speichern können. Nachdem Sie die Daten sessionbasiert gespeichert haben, können Sie eine Routine schreiben, die überprüft, ob diese Sitzung dem Muster entspricht oder nicht. Keine Notwendigkeit, Joins oder irgendetwas zu tun, nur eine Schleife über eine Liste von Transaktionen in einer Sitzung. Dies ist die Stärke halbstrukturierter Daten.

Was passiert, wenn Sie Ihre Sitzungen zusammen speichern? Dann müssen Sie nur noch jede Sitzung durchlaufen und prüfen, ob sie übereinstimmt.

Dies ist meiner Meinung nach ein fantastischer Anwendungsfall für HBase.

Mit HBase speichern Sie die Sitzungs-ID als Zeilenschlüssel, dann jedes der Ereignisse als Werte mit dem Zeitstempel als Spaltenqualifizierer. Was Sie hinterlässt, sind Daten, die nach Sitzungs-ID gruppiert und dann nach Zeit sortiert sind.

Ok, also jetzt wollen Sie herausfinden, wie% der Sitzungen Verhalten 1, dann 2, dann 3 umgesetzt. Sie führen einen MapReduce-Job über diese Daten.Der MapReduce-Job bietet Ihnen ein Schlüssel/Wert-Paar für eine Sitzung pro Zeile. Schreiben Sie eine Schleife über die Daten, um zu prüfen, ob sie mit dem Muster übereinstimmt. Wenn es + 1 zählt, wenn nicht, nicht.

Ohne mit HBase zu gehen, können Sie MapReduce verwenden, um Ihre unorganisierten Daten in Ruhe zu sessionalisieren. Nach der Sitzungs-ID gruppieren, dann werden im Reduzierer alle mit dieser Sitzung verknüpften Ereignisse gruppiert. Jetzt sind Sie im Grunde mit HBase, wo Sie eine Methode im Reducer schreiben können, die nach dem Muster sucht.


HBase ist möglicherweise übertrieben, wenn Sie keine lächerliche Datenmenge haben. Jede Art von Datenbank, die Daten hierarchisch speichern kann, ist in dieser Situation gut. MongoDB, Cassandra, Redis kommen alle in den Sinn und haben ihre Stärken und Schwächen.

+0

Nicht sicher, ob ich klar war oder nicht, aber ich möchte, dass Benutzer einen Trichter definieren können (Schritte und übereinstimmende Ereignisse pro Schritt) und Berichte zu historischen Daten anzeigen können. Ich denke, das bedeutet, dass ich Batch-Jobs ausführen muss, um alte Daten in den angegebenen Datenspeicher/Struktur zu ziehen, oder? Es gibt keinen magischen Weg um dieses Recht? – Blankman

+0

Ich habe gerade auf HBase gelesen, und ich mag, wie ich verwandte Daten in einer solchen gruppierten Art usw. gespeichert haben könnte. Wie würde ich etwas ähnliches mit Mongodb tun? (hbase könnte an dieser Stelle zu viel für mich sein) – Blankman

+0

Ja, Sie müssen eine Art von Prozess schreiben, um sie zusammen zu bringen, oder wenn Sie einen Datenspeicher verwenden, der solche Daten speichert, können Sie nur die Datensätze ändern. Wenn Sie Benutzer und nicht Sitzungen verwenden, gruppieren Sie sie einfach nach den Benutzern und nicht nach der Sitzungs-ID. –

7

Zuerst die Antwort unter Verwendung von Standard-SQL, Ihre Hypothese gegeben: eine Tabelle EVENT mit einem einfachen Layout ist:

EVENTS 
----------------------------- 
SESION_ID , EVENT_NAME , TMST 

die Sitzung zu erhalten, den Schritt # 1 zu einem bestimmten Zeitpunkt durchgeführt:

-- QUERY 1 
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID; 

Hier mache ich die Annahme, dass event1 mehr als einmal pro Sitzung passieren kann. Das Ergebnis ist eine Liste eindeutiger Sitzungen, in denen zu einem bestimmten Zeitpunkt event1 angezeigt wurde.

Um Schritt 2 und Schritt 3 zu bekommen, kann ich nur das gleiche:

-- QUERY 2 
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID; 
-- QUERY 3 
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event3' GROUP BY SESSION_ID; 

Jetzt wollen Sie Sitzungen wählen, den Schritt 1, Schritt 2 und Schritt 3 durchgeführt - in dieser Reihenfolge. Genauer gesagt müssen Sie die Sitzungen zählen, die Schritt 1 durchgeführt haben, dann die Sitzung zählen, die Schritt2 ausgeführt hat, und dann die Sitzungen zählen, die Schritt3 ausgeführt haben. Grundsätzlich müssen wir kombinieren einfach verbinden, um die drei oben Abfragen mit links an den Sitzungen auflisten, die den Trichter eingegeben und welche Schritte sie ausgeführt:

-- FUNNEL FOR S1/S2/S3 
SELECT 
    SESSION_ID, 
    Q1.TMST IS NOT NULL AS PERFORMED_STEP1, 
    Q2.TMST IS NOT NULL AS PERFORMED_STEP2, 
    Q3.TMST IS NOT NULL AS PERFORMED_STEP3 
FROM 
    -- QUERY 1 
    (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID) AS Q1, 
LEFT JOIN 
    -- QUERY 2 
    (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q2, 
LEFT JOIN 
    -- QUERY 3 
    (SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q3 
-- Q2 & Q3 
ON Q2.SESSION_ID=Q3.SESSION_ID AND Q2.TMST<Q3.TMST 
-- Q1 & Q2 
ON Q1.SESSION_ID=Q2.SESSION_ID AND Q1.TMST<Q2.TMST 

Das Ergebnis ist eine Liste der einzigartigen Sitzung ist, die den Trichter in Schritt 1 eingegeben, und hat zu Schritt 2 und Schritt 3 fortgesetzt ... zB:

SESSION_ID_1,TRUE,TRUE,TRUE 
SESSION_ID_2,TRUE,TRUE,FALSE 
SESSION_ID_3,TRUE,FALSE,FALSE 
... 

Jetzt müssen wir nur einige Statistiken berechnen, zum Beispiel:

SELECT 
    STEP1_COUNT, 
    STEP1_COUNT-STEP2_COUNT AS EXIT_AFTER_STEP1, 
    STEP2_COUNT*100.0/STEP1_COUNT AS PERCENTAGE_TO_STEP2, 
    STEP2_COUNT-STEP3_COUNT AS EXIT_AFTER_STEP2, 
    STEP3_COUNT*100.0/STEP2_COUNT AS PERCENTAGE_TO_STEP3, 
    STEP3_COUNT*100.0/STEP1_COUNT AS COMPLETION_RATE 
FROM 
(-- QUERY TO COUNT session at each step 
    SELECT 
    SUM(CASE WHEN PERFORMED_STEP1 THEN 1 ELSE 0 END) AS STEP1_COUNT, 
    SUM(CASE WHEN PERFORMED_STEP2 THEN 1 ELSE 0 END) AS STEP2_COUNT, 
    SUM(CASE WHEN PERFORMED_STEP3 THEN 1 ELSE 0 END) AS STEP3_COUNT 
    FROM 
    [... insert the funnel query here ...] 
) AS COMPUTE_STEPS 

Et voilà!

Jetzt für die Diskussion. Der erste Punkt, das Ergebnis ist ziemlich einfach, wenn Sie die "set" (oder funktionale) Art des Denkens und nicht die "prozedurale" Ansatz nehmen. Visualisiere die Datenbank nicht als eine Sammlung von festen Tabellen mit Spalten und Zeilen ... so ist es implementiert, aber es ist nicht die Art, wie du mit ihr interagierst. Es ist alles Sets, und Sie können die Sets so arrangieren, wie Sie es brauchen!

Zweiter Punkt, dass Abfrage automatisch optimiert wird, um parallel zu laufen, wenn Sie zum Beispiel eine MPP-Datenbank verwenden. Sie müssen die Abfrage nicht einmal anders programmieren, verwenden Sie map-reduce oder was auch immer ... Ich habe dieselbe Abfrage in meinem Test-Dataset mit mehr als 100 Millionen Ereignissen durchgeführt und Ergebnisse in Sekunden erhalten.

Last but not least eröffnet die Abfrage endlose Möglichkeiten.Gruppieren Sie einfach nach den Ergebnissen des Refeurs, den Keywords, der Landingpage, den Benutzerinformationen und analysieren Sie, was zum Beispiel die beste Konvertierungsrate bietet!

+0

Ich denke, diese Abfrage könnte ein Problem haben, zum Beispiel, wenn ich wissen will, wer tat: E1, E2, E3 und ich haben eine Sitzung mit E2, E1, E2, E3 Ich glaube, die obige Abfrage wird fehlschlagen (da es nur berücksichtigt erstes Auftreten eines Ereignisses) – shaylevi2

+0

Eigentlich nicht. Die einzige Einschränkung in der anfänglichen Abfrage ist, dass E1 E2 => E3 zu erzwingen, aber das wird zählen müssen das Ereignis in einer Sitzung zuerst (das kann leicht mit einer Fensterfunktion zum Beispiel gemacht werden) – SergeFantino

0

ich vor kurzem veröffentlichte ein Open-Source-Hive UDF, dies zu tun: hive-funnel-udf

Es ist ziemlich einfach für diese Art Trichter Analyseaufgabe zu verwenden, können Sie einfach schreiben Hive, keine Notwendigkeit, benutzerdefinierten Java MapReduce-Code zu schreiben.

Dies funktioniert nur, wenn Sie Hive/Hadoop zum Speichern und Abfragen Ihrer Daten verwenden.

+2

Bitte nicht [doppelte Antworten] (// meta.stackexchange.com/a/211726/206345). Betrachten Sie stattdessen andere Aktionen, die zukünftigen Benutzern helfen könnten, die Antwort zu finden, die sie benötigen, wie in dem verlinkten Post beschrieben. – Mogsdad

Verwandte Themen